我花了一些时间试图弄清楚为什么这个查询没有拉出我预期的结果:
SELECT * FROM NGS WHERE ESPSSN NOT IN (SELECT SSN FROM CENSUS)
最后我尝试用另一种方式编写查询,此最终得到了预期结果:
SELECT * FROM NGS n WHERE NOT EXISTS (SELECT * FROM CENSUS WHERE SSN = n.ESPSSN)
第一个查询似乎更合适且“正确”。我一直使用“in”和“not in”进行类似的选择,并且从未遇到过我知道的 。
答案 0 :(得分:11)
如果你写出语法糖,x not in (1,2,3)
就变成了:
x <> 1 AND x <> 2 AND x <> 3
因此,如果ssn
列包含空值,则第一个查询等效于:
WHERE ESPSSN <> NULL AND ESPSSN <> ...
与NULL比较的结果是未知的,因此查询不会返回任何内容。
答案 1 :(得分:2)
正如Andomar所说,使用NOT IN
另请注意,使用NOT IN
谓词的查询将始终执行嵌套的全表扫描,而使用NOT EXISTS
的查询可以使用子查询中的索引,并且结果要快得多。