2016-09-11 32 views
0

我在我的SQL数据库中有2个表。我们称它们为表A和表B. 我已经使用ID = AID上的左连接加入了两个表。表A具有按名称ID的字段,表B具有字段AID和价格。 问题是表B可以有多个表A中存在的ID的价格。左连接返回表B中对应于表A中ID的多个行

要求是 - 如果表B中只有一个价格与表A中的ID相对应,那么它应该返回该价格。 如果表B中存在多于一种价格的表A中的ID,那么我应该将价格作为零/空值。

查询 -

SELECT DISTINCT A.ID,B.Price 
    from A 
    left join B 
    on A.ID = B.AID 
    where "some condition" 
+0

MySQL或sql.server ..请删除不当的标签.. – scaisEdge

回答

1

使用Count()Over()窗函数查找记录每个ID然后根据计计数返回price

尝试这种方式

SELECT DISTINCT A.ID, 
     case when count(1) over(partition by A.ID) > 1 then NULL else B.Price end 
from A 
left join B 
on A.ID = B.AID 

对于Mysql

SELECT DISTINCT a.id, 
       CASE 
        WHEN c.aid IS NULL THEN NULL 
        ELSE b.price 
       END 
FROM a 
     LEFT JOIN b 
       ON a.id = b.aid 
     LEFT JOIN (SELECT aid 
        FROM b 
        GROUP BY aid 
        HAVING Count(1) = 1) c 
       ON a.id = c.aid 
+0

当我使用上面的我的查询中我得到语法错误附近在M。 – ashish

+0

@ashish - 你正在使用'Mysql'或'Sql Server' –

+0

对不起,它的mysql和我忘了告诉你,最初我使用内部查询,你提出的相同。但它需要很长时间才能在android 5.0和6.0上运行,但在android 4.4上运行正常。所以我尝试了加入,它正在执行正常的时间,只是我的要求没有得到满足。所以我发布了这个查询。我感谢您的帮助。 – ashish

1

对于SQL服务器(应为MySQL的工作太)。一个子查询(你可以把CTE),只显示AID只具有一个价S:下面的查询

SELECT A.ID, 
     B.Price 
FROM A 
LEFT JOIN (
     SELECT AID 
     FROM B 
     GROUP BY AID 
     HAVING COUNT(Price) = 1 
    ) as C 
    ON C.AID = A.ID 
LEFT JOIN B 
    ON C.AID = B.AID 
+1

在'mysql'中工作 – Drew

+0

好,因为op不能upvote,我会upvote你两个人 – Drew

+0

@Drew谢谢,为测试(我只检查了SQL Server)和投票! – gofr1

0

使用。它应该工作。

SELECT A.ID, o.Price 
FROM A 
OUTER APPLY 
     ( 
      SELECT IIF(COUNT(B.Price)>1,NULL,MAX(B.Price)) AS Price 
      FROM B 
      WHERE B.AID = A.ID 
     ) AS o;  

Screenshot

相关问题