繁体   English   中英

SQL仅以一对多关系选择一条记录

[英]SQL to pick only one record in one-to-many relationship

在下面的当前/潜在客户查询中,我需要显示CustomerID,客户的姓氏以及一列,该列显示客户是否已下达at least一个订单。 但是,正如预期的那样,如果客户下了多个订单(一对多关系),它将显示客户的多个记录。 问题 :由于我们仅需要报告客户是否已下达至少一个订单,因此在这里如何仅显示每个客户一个记录?

SELECT c.customerID, o.OrderID, CASE When ISNULL(o.OrderID, 0) = 0 Then 0 Else 
1 End as YesNO
FROM Customers c
LEFT JOIN Orders o
 ON c.customerID = o.customerID

使用outer apply()

select 
    c.customerID
  , o.OrderID
  , case when o.OrderID is null then 0 else 1 end as YesNO
from Customers c
  outer apply (
    select top 1 o.OrderID
    from Orders o
    where c.customerID = o.customerID
  ) o

您也可以使用o.OrderId is null而不是ISNULL(o.OrderID, 0) = 0


使用group bymin()

select 
    c.customerID
  , min(o.OrderID) as OrderId
  , case when min(o.OrderID) is null then 0 else 1 end as YesNO
from Customers c
  left join Orders o 
    on c.customerID = o.customerID 
group by c.CustomerID  

使用分组依据。

SELECT c.customerID, o.OrderID, CASE When ISNULL(o.OrderID, 0) = 0 Then 0 Else 1 End as YesNOFROM Customers cLEFT JOIN Orders o ON c.customerID = o.customerID GROUP BY c.customerID

如果您相信问题的描述,即您想知道某个客户是否已下订单,但不需要为每个客户提供有代表性的OrderId

select C.CustomerId,
  case when exists ( select 42 from Orders as O where O.CustomerId = C.CustomerId )
    then 1 else 0 end as YesNo
  from Customers as C;

请注意,当您不需要确切的数字时, existscount更有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM