首页 > 解决方案 > SQL - 列出我们在 1996 年没有进行销售的所有客户

问题描述

这是我的功能性 SQL 查询,用于返回我们在 1996 年出售给的客户:

   SELECT C.CustomerID, C.CompanyName
   FROM Customers C, Orders O
   WHERE C.CustomerID = O.CustomerID AND YEAR(O.OrderDate) = 1996
   GROUP BY C.CustomerID, C.CompanyName
   ORDER BY C.CustomerID

现在我试图展示相反的东西;退回所有我们在 1996 年没有卖给他们的客户即使我们在其他年份确实卖给了他们)。这就是我所拥有的,但是它既返回了我们在 1996 年没有卖给的客户,也返回了我们做过的客户:

SELECT C.CustomerID, C.CompanyName FROM Orders O JOIN Customers C
ON O.CustomerID = C.CustomerID 
WHERE YEAR(O.OrderDate) != 1996
GROUP BY C.CustomerID, C.CompanyName
ORDER BY C.CustomerID

标签: sqldatetimesubqueryleft-join

解决方案


我们可以基于您现有的查询并使用left join反模式:

SELECT C.CustomerID, C.CompanyName
FROM Customers C
LEFT JOIN Orders O
    ON  C.CustomerID = O.CustomerID 
    AND O.OrderDate >= '1996-01-01'
    AND O.OrderDate <  '1997-01-01'
WHERE O.CustomerID IS NULL
ORDER BY C.CustomerID

这句话为:尝试将每个客户与他们在 1996 年下的订单联系起来,并过滤那些没有任何订单的客户。

边注:

  • 始终使用显式的标准连接(使用ON关键字);应该避免老式的隐式连接(FROM子句中没有逗号)

  • 正如sticky bit(他的答案是有效的,我赞成)所评论的那样,使用日期比较比依赖日期函数更好的形式性能


推荐阅读