我在問自己是否應該使用<> ALL
或NOT IN
。看看這兩個示例查詢:NOT IN與<> ALL之間的主要區別是什麼?
SELECT PersonId FROM tabPerson
WHERE PersonId NOT IN(SELECT ParentId FROM tabPerson)
兩個查詢返回的結果完全一樣。
現在我想知道<> ALL
和NOT IN
之間的主要區別是什麼。有人有想法嗎?
我在問自己是否應該使用<> ALL
或NOT IN
。看看這兩個示例查詢:NOT IN與<> ALL之間的主要區別是什麼?
SELECT PersonId FROM tabPerson
WHERE PersonId NOT IN(SELECT ParentId FROM tabPerson)
兩個查詢返回的結果完全一樣。
現在我想知道<> ALL
和NOT IN
之間的主要區別是什麼。有人有想法嗎?
兩個查詢會產生完全相同的結果。即使在子查詢中查詢的列包含NULL值,也不會有任何區別。
我比較了這些查詢在我的數據庫中的表上的幾個執行計劃,並且在每種情況下它們也完全相同。
所以只有唯一的區別是代碼對其他開發者的可讀性/熟悉性。這裏的NOT IN
表達式有明顯的優勢。 ALL
(和ANY
和SOME
)關鍵字很少使用,並且會讓其他開發者感到陌生。
查看MS Technet文章Comparison Operators Modified by ANY, SOME, or ALL瞭解關於這些關鍵字的更多解釋。 - 順便說一句:這篇文章的結論是發現你的問題的兩個陳述是相同的。
此語句是相似的:
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)
是的,我知道他們返回相同的結果。但我想知道是否在性能或執行方面有所不同。 –
如果您希望他人瞭解您的查詢,請使用'NOT IN' –
我假設第二個短路,但編譯器可能會識別等效。您實際上可以在SSMS中運行這兩個查詢並查看實際的查詢計劃。你不知道該怎麼做? – Will
@TimSchmelter我知道'<> ALL'不像'NOT IN'那樣可讀,我討厭不可讀的代碼,但是我想知道它們之間在性能或執行方面是否有任何不同。 –