Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 不在与<;之间的主要区别是什么&燃气轮机;全部的_Sql Server_Performance_Tsql_Execution - Fatal编程技术网

Sql server 不在与<;之间的主要区别是什么&燃气轮机;全部的

Sql server 不在与<;之间的主要区别是什么&燃气轮机;全部的,sql-server,performance,tsql,execution,Sql Server,Performance,Tsql,Execution,我在问自己是应该在中使用全部还是不使用。请看以下两个示例查询: SELECT PersonId FROM tabPerson WHERE PersonId <> ALL(SELECT ParentId FROM tabPerson) 这两个查询返回的结果完全相同 现在我想知道ALL和NOT IN之间的主要区别是什么。有人有想法吗?这句话很相似: DECLARE @t1 TABLE (a INT) INSERT INTO @t1 VALUES (1), (2) DECLARE @t

我在问自己是应该在中使用
全部
还是不使用
。请看以下两个示例查询:

SELECT PersonId FROM tabPerson
WHERE PersonId <> ALL(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)

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

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

因此,唯一的区别是其他开发人员对代码的可读性/熟悉程度。这里的
表达式中没有
有一个明显的优点。
ALL
(以及同样的
ANY
SOME
)关键字很少使用,其他开发人员会感到陌生


有关这些关键字的进一步解释,请参阅MS Technet文章顺便说一句:本文的结论是,您的问题中的两个语句是等价的。

如果您想让其他人理解您的查询,请使用
而不是
我假设第二个短路,但编译器可能会识别出等价性。实际上,您可以在SSMS中运行这两个查询并查看实际的查询计划。你不知道怎么做吗?@TimSchmelter我知道
ALL
不如
not IN
可读,我讨厌不可读的代码,但是我想知道它们之间的性能或执行是否有任何差异。哈,刚刚运行了它,查询计划100%完全相同。所以这其实没有什么区别,只是可读性不同而已。更好的可读性一直是我的目标。从SQLServer6.5开始,我就一直在使用SQLServer,直到今天我才听说这一切。BOL中的示例是如此精心设计,以至于在现实世界中没有人会编写这样的查询。是的,我知道他们返回相同的结果。但我想知道在性能或执行方面是否存在差异。
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)
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)