左连接返回表B中对应于表A中存在的ID的多行

时间:2016-09-11 15:32:09

标签: mysql

我的SQL数据库中有2个表。我们称之为表A和表B. 我在ID = AID上使用左连接加入了两个表。表A具有按名称ID的字段,表B具有字段AID和价格。 问题是表B可以为表A中的ID提供多个价格。

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

查询 -

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

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

对于 SQL Server (也适用于 MySQL )。一个子查询(您可以放入CTE)只显示只有一个价格的AID

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 

答案 2 :(得分: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