如何修复SQL语句,查询未购买过Pizza的客户ID、姓名?
原SQL存在的问题
- 关联条件错误:
Customers表的客户IDID应该关联Orders表的外键CustomerId,而不是OrderID,关联键不匹配会导致查询结果完全错误 - 子句顺序错误:SQL语法要求
WHERE子句必须放在ORDER BY子句之前,原写法顺序违反语法规则 - 逻辑完全反向:原条件
cp.Purchase LIKE '%Pizza%'是查询买过Pizza的客户,和需求完全相反;且使用INNER JOIN会自动过滤没有任何订单的客户,这部分从未下单的客户本身也符合「从未买过Pizza」的要求,会被漏掉 - 字段名不匹配:
Customers表的姓名字段为Name、Surname,原SQL写的FirstName、LastName不存在,查询会报字段不存在错误
原判断条件不生效的原因
你之前用cp.Purchase != "Pizza"不生效是因为:该条件只能过滤掉单条买Pizza的订单记录,如果一个客户同时有其他非Pizza的订单,这些订单行还是会被保留,最终查询结果会把「买过Pizza但也买过其他商品」的客户也包含进来,不符合需求。
修复方案
推荐使用NOT EXISTS写法,性能和兼容性都更好:
SELECT c.ID, c.Name, c.Surname FROM Customers c WHERE NOT EXISTS ( SELECT 1 FROM Orders cp WHERE cp.CustomerId = c.ID AND cp.Purchase LIKE '%Pizza%' ) ORDER BY c.ID
如果更习惯用JOIN写法,也可以用LEFT JOIN加空判断:
SELECT DISTINCT c.ID, c.Name, c.Surname FROM Customers c LEFT JOIN Orders cp ON c.ID = cp.CustomerId AND cp.Purchase LIKE '%Pizza%' WHERE cp.OrderId IS NULL ORDER BY c.ID
内容的提问来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

