我问自己是否应该使用<> 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
之间的主要区别是什么。有没有人有想法?
答案 0 :(得分:1)
两个查询都会产生完全相同的结果。即使子查询中查询的列包含NULL值,它也不会有任何区别。
我在这里对数据库中的表格进行了比较,并且在每种情况下它们也完全相同。
因此,唯一的区别是代码的可读性/熟悉程度给其他开发人员。这里的NOT IN
表达式有明显的优势。 ALL
(以及同等ANY
和SOME
)关键字很少使用,并且会让其他开发者感到陌生。
有关这些关键字的进一步说明,请参阅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)