SQL查询无结果排查:符合条件的WOID为何未返回?
问题根源及解决方案
你的查询问题出在NOT IN子查询的NULL值陷阱上。
当NOT IN子查询返回的结果集中包含NULL值时,SQL的逻辑判断会出现异常:因为任何值和NULL做比较都会返回UNKNOWN(既不是真也不是假),导致整个WOID NOT IN (...)条件的结果为UNKNOWN,最终所有符合其他条件的行都会被过滤掉,哪怕目标WOID不在子查询的非NULL结果里。
验证方式
先执行以下语句检查子查询是否存在NULL值:
SELECT WOID FROM serialized_assembly WHERE WOID IS NULL;
如果返回结果不为空,就说明是这个问题导致的。
解决办法
方法1:子查询中排除NULL值
修改子查询,明确过滤掉WOID为NULL的记录:
SELECT * FROM work_orders WHERE LineKey = 'ABC' AND StateKey = 'Approved' AND orderKey = 'Released' AND WOID NOT IN ( SELECT WOID FROM serialized_assembly WHERE WOID IS NOT NULL -- 新增这行排除NULL GROUP BY WOID HAVING COUNT(WOID) > 9 ) LIMIT 1;
方法2:改用NOT EXISTS(更推荐)
NOT EXISTS对NULL的处理逻辑更直观,不会出现上述陷阱,改写后的查询如下:
SELECT * FROM work_orders wo WHERE LineKey = 'ABC' AND StateKey = 'Approved' AND orderKey = 'Released' AND NOT EXISTS ( SELECT 1 FROM serialized_assembly sa WHERE sa.WOID = wo.WOID GROUP BY sa.WOID HAVING COUNT(sa.WOID) > 9 ) LIMIT 1;
内容的提问来源于stack exchange,提问作者user20146221
相关产品推荐
相关产品推荐

