You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:06:00