使用NOT EXISTS子查询筛选特定SKU客户无结果的技术问题
解决你的查询无结果问题
嘿,我一眼就看出问题出在哪了——你的NOT EXISTS子查询根本没和外部的主查询关联起来!这就导致只要在指定日期范围内有任何一个用户买过SKU 'Red323',整个NOT EXISTS条件就会返回false,主查询自然就查不到任何结果了。
问题根源
你原来的子查询是完全独立的:
NOT EXISTS ( SELECT DISTINCT o."Email" FROM flight_export_order o JOIN flight_export_orderline ol ON o."OrderDisplayID" = ol."OrderDisplayID" WHERE ol."SKU" = 'Red323' AND o."OrderDate" BETWEEN '07/22/2020' AND '08/03/2020' )
这个子查询只会检查“有没有人买过Red323”,而不是“当前主查询的这个客户有没有买过Red323”。只要存在符合条件的记录,NOT EXISTS就会直接否定整个主查询的结果。
修正后的查询
我们需要给子查询的表加别名,然后关联外部查询的客户标识(这里用Email,如果有专门的客户ID字段会更准确),确保子查询只针对当前客户做检查:
SELECT DISTINCT o."FirstName", o."LastName", o."Email" FROM flight_export_order o JOIN flight_export_orderline ol ON o."OrderDisplayID" = ol."OrderDisplayID" WHERE ol."SKU" = 'Red399' AND o."OrderDate" BETWEEN '07/22/2020' AND '08/03/2020' AND NOT EXISTS ( SELECT 1 -- 存在性检查不需要返回具体字段,SELECT 1效率更高 FROM flight_export_order o_inner JOIN flight_export_orderline ol_inner ON o_inner."OrderDisplayID" = ol_inner."OrderDisplayID" WHERE ol_inner."SKU" = 'Red323' AND o_inner."OrderDate" BETWEEN '07/22/2020' AND '08/03/2020' AND o_inner."Email" = o."Email" -- 关键:关联外部查询的同一个客户 )
额外优化建议
- 去掉主查询
SELECT里的ol."SKU":因为已经在WHERE里过滤了ol."SKU" = 'Red399',返回的所有结果里这个字段值都是固定的,没必要重复输出。 - 如果
Email不是唯一的客户标识(比如存在不同客户共用邮箱的情况),建议用更唯一的字段(比如客户ID)来关联子查询,避免出现错误的筛选结果。
内容的提问来源于stack exchange,提问作者ekeckeisen
相关产品推荐
相关产品推荐

