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

What are the main differences between NOT IN vs. <> ALL?

我在问自己应该使用<> ALL还是NOT 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 之间的主要区别是什么。有人有想法吗?

这种说法类似:

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)

两个查询将产生完全相同的结果。即使子查询中查询的列中包含NULL值,也没有什么区别。

我在这里比较了对我的数据库中的表执行此类查询的几个执行计划,在每种情况下它们也完全相同。

所以唯一的区别是 readability/familiarity 代码对其他开发人员的影响。这里的 NOT IN 表达式有一个明显的优势。 ALL(以及 ANYSOME)关键字很少使用,并且对其他开发人员来说感觉很陌生。

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