为什么“不存在”SQL查询工作和“不存在”没有

时间:2010-04-02 17:34:05

标签: sql tsql sql-server-2008

我花了一些时间试图弄清楚为什么这个查询没有拉出我预期的结果:

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”进行类似的选择,并且从未遇到过我知道的

2 个答案:

答案 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

时要小心NULL值

另请注意,使用NOT IN谓词的查询将始终执行嵌套的全表扫描,而使用NOT EXISTS的查询可以使用子查询中的索引,并且结果要快得多。