Oracle SQL求助:查找缺失的Item-DC关联记录
问题分析与解决方案
你写的SQL存在几个关键问题:
- 逻辑矛盾:WHERE子句同时指定
DC = 'DC1'和NOT EXISTS (SELECT * FROM SKU WHERE DC = 'DC1'),前者限定只查DC1的记录,后者要求不存在DC1的记录,两个条件无法同时满足,自然查不到结果。 - 子查询未关联主表:NOT EXISTS里的子查询没有和主表的Item关联,无法针对每个Item判断是否存在DC1的关联记录。
- 语法错误:子查询末尾缺少闭合的
)。
正确SQL写法
方法1:使用NOT EXISTS关联Item
SELECT DISTINCT s.Item FROM SKU s WHERE s.Warehouse IN ('WH-A','WH-B','WH-C') AND NOT EXISTS ( SELECT 1 FROM SKU s2 WHERE s2.Item = s.Item AND s2.DC = 'DC1' )
解释:
- 主表筛选出Warehouse在目标范围内的所有记录,通过
DISTINCT确保每个Item只返回一次。 - 子查询关联主表的Item,判断该Item是否存在DC1的关联记录,
NOT EXISTS就表示这个Item没有配置DC1。
方法2:使用分组筛选
SELECT Item FROM SKU WHERE Warehouse IN ('WH-A','WH-B','WH-C') GROUP BY Item HAVING SUM(CASE WHEN DC = 'DC1' THEN 1 ELSE 0 END) = 0
解释:
- 先按Item分组,统计每个Item下DC1的记录数。
HAVING子句筛选出DC1记录数为0的Item,也就是未配置DC1的Item。
内容的提问来源于stack exchange,提问作者redoctober
相关产品推荐
相关产品推荐

