【问题标题】:What are the main differences between NOT IN vs. <> ALL?NOT IN 与 <> ALL 之间的主要区别是什么?
【发布时间】:2016-04-14 13:01:39
【问题描述】:

我在问自己应该使用&lt;&gt; 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)

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

现在我想知道&lt;&gt; ALLNOT IN 之间的主要区别是什么。有人有想法吗?

【问题讨论】:

  • 如果您希望其他人了解您的查询,请使用NOT IN
  • 我假设第二次短路,但编译器可能会识别出等价性。您实际上可以在 SSMS 中运行这两个查询并查看实际的查询计划。你不知道该怎么做吗?
  • @TimSchmelter 我知道&lt;&gt; ALL 的可读性不如NOT IN,我讨厌不可读的代码,但是我想知道它们之间的性能或执行是否有任何差异。
  • 哈,刚刚运行,查询计划100%完全一样。所以真的没有区别,只是在可读性上。更好的可读性始终是最好的选择。
  • 我从 sql server 6.5 开始就一直在使用 sql server,直到今天才听说过 ALL。 BOL 中的示例非常人为,以至于在现实世界中没有人会编写这样的查询。 msdn.microsoft.com/en-us/library/ms178543.aspx

标签: sql-server performance tsql execution


【解决方案1】:

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

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

因此,唯一的区别是其他开发人员对代码的可读性/熟悉程度。 NOT IN 表达式在这里有一个明显的优势。 ALL(同样是ANYSOME)关键字很少使用,其他开发人员会觉得很陌生。

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

【讨论】:

    【解决方案2】:

    这句话类似:

    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)
    

    【讨论】:

    • 是的,我知道它们返回相同的结果。但我想知道性能或执行是否存在差异。
    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2015-08-06
    • 2011-03-06
    • 2013-12-23
    • 2017-04-28
    • 2011-04-14
    相关资源
    最近更新 更多