SQL问题:查询仅在Col1不在Col2的值结果为空的原因及无JOIN解法
问题分析与解决方案
问题原因
你的查询返回空结果,核心原因是NOT IN子查询中包含NULL值。SQL中任何值与NULL进行比较(包括NOT IN逻辑)都会返回UNKNOWN,而WHERE子句仅会保留判断结果为TRUE的行,所有行的判断结果都不符合要求,最终返回空集。
你的子查询SELECT t1.Col2 FROM data AS t1会返回包含NULL的结果集(对应表中第一行的col2值),当执行Col1 NOT IN (NULL,1,2,2,2)时,以Col1=3为例,判断逻辑等价于3 != NULL AND 3 !=1 AND 3 !=2,但3 != NULL的结果是UNKNOWN,导致整个条件结果为UNKNOWN,无法被WHERE子句筛选,所有行都存在这个问题,因此返回空。
不使用JOIN的正确查询语句
提供两种可行的解决方案:
方案1:过滤子查询中的NULL值
在子查询中排除NULL,让NOT IN逻辑正常生效:
SELECT t.Col1 FROM data AS t WHERE t.Col1 NOT IN (SELECT t1.Col2 FROM data AS t1 WHERE t1.Col2 IS NOT NULL)
方案2:使用NOT EXISTS替代NOT IN
NOT EXISTS对NULL的处理逻辑更直观,只要子查询无匹配行就返回TRUE:
SELECT t.Col1 FROM data AS t WHERE NOT EXISTS (SELECT 1 FROM data AS t1 WHERE t1.Col2 = t.Col1)
以上两种语句都能得到预期结果:3、4、5。
内容的提问来源于stack exchange,提问作者Joanna
相关产品推荐
相关产品推荐

