NOT IN与<>之间的主要区别是什么?所有?

时间:2016-04-14 13:01:39

标签: sql-server performance tsql execution

我问自己是否应该使用<> ALLNOT IN。看看这两个示例查询:

SELECT PersonId FROM tabPerson
WHERE PersonId <> ALL(SELECT ParentId FROM tabPerson)
SELECT PersonId FROM tabPerson
WHERE PersonId NOT IN(SELECT ParentId FROM tabPerson)

两个查询返回完全相同的结果。

现在我想知道<> ALLNOT IN之间的主要区别是什么。有没有人有想法?

2 个答案:

答案 0 :(得分:1)

两个查询都会产生完全相同的结果。即使子查询中查询的列包含NULL值,它也不会有任何区别。

我在这里对数据库中的表格进行了比较,并且在每种情况下它们也完全相同。

因此,唯一的区别是代码的可读性/熟悉程度给其他开发人员。这里的NOT IN表达式有明显的优势。 ALL(以及同等ANYSOME)关键字很少使用,并且会让其他开发者感到陌生。

有关这些关键字的进一步说明,请参阅MS Technet文章 Comparison Operators Modified by ANY, SOME, or ALL 。 - 顺便说一句:本文最后得出结论,你的问题中的两个陈述都是等价的。

答案 1 :(得分:0)

这些陈述类似:

DECLARE @t1 TABLE (a INT)
INSERT INTO @t1 VALUES (1), (2)

DECLARE @t2 TABLE (b INT)
INSERT INTO @t2 VALUES (2)

SELECT * FROM @t1
WHERE a <> ALL(SELECT b FROM @t2)

SELECT * FROM @t1
WHERE a NOT IN (SELECT b FROM @t2)

即使我们谈论NULL值的问题:

INSERT INTO @t2(b) VALUES (NULL)

SELECT * FROM @t1
WHERE a <> ALL(SELECT b FROM @t2)

SELECT * FROM @t1
WHERE a NOT IN (SELECT b FROM @t2)