2016-04-14 233 views
4

我在問自己是否應該使用<> ALLNOT IN。看看這兩個示例查詢:NOT IN與<> ALL之間的主要區別是什麼?

​​
SELECT PersonId FROM tabPerson 
WHERE PersonId NOT IN(SELECT ParentId FROM tabPerson) 

兩個查詢返回的結果完全一樣。

現在我想知道<> ALLNOT IN之間的主要區別是什麼。有人有想法嗎?

+7

如果您希望他人瞭解您的查詢,請使用'NOT IN' –

+0

我假設第二個短路,但編譯器可能會識別等效。您實際上可以在SSMS中運行這兩個查詢並查看實際的查詢計劃。你不知道該怎麼做? – Will

+0

@TimSchmelter我知道'<> ALL'不像'NOT IN'那樣可讀,我討厭不可讀的代碼,但是我想知道它們之間在性能或執行方面是否有任何不同。 –

回答

1

兩個查詢會產生完全相同的結果。即使在子查詢中查詢的列包含NULL值,也不會有任何區別。

我比較了這些查詢在我的數據庫中的表上的幾個執行計劃,並且在每種情況下它們也完全相同。

所以只有唯一的區別是代碼對其他開發者的可讀性/熟悉性。這裏的NOT IN表達式有明顯的優勢。 ALL(和ANYSOME)關鍵字很少使用,並且會讓其他開發者感到陌生。

查看MS Technet文章Comparison Operators Modified by ANY, SOME, or ALL瞭解關於這些關鍵字的更多解釋。 - 順便說一句:這篇文章的結論是發現你的問題的兩個陳述是相同的。

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) 
+0

是的,我知道他們返回相同的結果。但我想知道是否在性能或執行方面有所不同。 –

相關問題