SQL查询问题:添加NOT EXISTS无结果,如何筛选目标客户
问题解答:筛选仅存在未完成订单的客户
你的问题出在子查询的条件customer=customer上——这里的两个customer都指向子查询内部的orders表,相当于自己和自己比较,永远为真,导致NOT EXISTS的条件永远不满足,自然查不到任何结果。
正确写法1:使用表别名关联子查询
给内外层的orders表分别起别名,明确关联同一个客户,确保子查询检查的是当前客户是否存在已完成订单:
SELECT DISTINCT o1.customer FROM orders o1 WHERE o1.shipped = 'yes' AND NOT EXISTS ( SELECT 1 FROM orders o2 WHERE o2.customer = o1.customer AND o2.shipped = 'no' ) ORDER BY o1.customer ASC;
正确写法2:分组后用HAVING筛选
通过分组统计每个客户的订单状态,直接筛选出存在未完成订单且无已完成订单的客户,无需额外去重:
SELECT customer FROM orders GROUP BY customer HAVING SUM(CASE WHEN shipped = 'yes' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN shipped = 'no' THEN 1 ELSE 0 END) = 0 ORDER BY customer ASC;
注:这里注意你用
shipped='yes'代表未完成订单,和常规命名逻辑(shipped='yes'通常指已完成发货)相反,如果是命名混淆,记得调整条件里的yes和no。
内容的提问来源于stack exchange,提问作者WeekendCoder
相关产品推荐
相关产品推荐

