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)
这两个查询返回的结果完全相同。
现在我想知道 <> ALL
和 NOT 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
(以及 ANY
和 SOME
)关键字很少使用,并且对其他开发人员来说感觉很陌生。
有关这些关键字的进一步说明,请参阅 MS Technet 文章 Comparison Operators Modified by ANY, SOME, or 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)
这两个查询返回的结果完全相同。
现在我想知道 <> ALL
和 NOT 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
(以及 ANY
和 SOME
)关键字很少使用,并且对其他开发人员来说感觉很陌生。
有关这些关键字的进一步说明,请参阅 MS Technet 文章 Comparison Operators Modified by ANY, SOME, or ALL。 – 顺便说一句:本文的结论是您的问题中的两个陈述是等价的。