是下面最高效的SQL實現其結果是:SQL:... WHERE X IN(選擇Y FROM ...)
SELECT *
FROM Customers
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS)
莫非一些使用的連接更好,達到同樣的結果?
是下面最高效的SQL實現其結果是:SQL:... WHERE X IN(選擇Y FROM ...)
SELECT *
FROM Customers
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS)
莫非一些使用的連接更好,達到同樣的結果?
原因之一,你可能更願意使用一個JOIN
而不是NOT IN
是,如果NOT IN
子句中值包含任何NULL
是你會always get back no results。如果您確實使用NOT IN
,請記住始終考慮子查詢是否可能帶回NULL值!
RE:問題中的註釋
'X' NOT IN(NULL, 'A', 'B')
≡的 'x' <> NULL和 'X' <>「一'和 'X' <> 'b'
≡未知和True和True
≡未知
也許嘗試這個
Select cust.*
From dbo.Customers cust
Left Join dbo.Subscribers subs on cust.Customer_ID = subs.Customer_ID
Where subs.Customer_Id Is Null
任何足夠成熟的SQL數據庫應能同樣有效地執行,作爲等價JOIN
。使用任何更易讀的東西。
+1這是正確的 - SQL Server將「NOT IN」和「NOT EXISTS」類型的查詢變成相同的執行計劃。 – eddiegroves 2010-06-02 10:41:38
SELECT Customers.*
FROM Customers
WHERE NOT EXISTS (
SELECT *
FROM SUBSCRIBERS AS s
JOIN s.Cust_ID = Customers.Customer_ID)
當使用「NOT IN」,該查詢執行嵌套全表掃描,而對於「NOT EXISTS」,查詢可以在子查詢中使用的索引。
取決於數據庫 - SQL Server將生成相同的執行計劃並執行索引查找(其中索引存在) – eddiegroves 2010-06-02 10:43:22
如果您想知道哪個更有效,應該嘗試查看估計的查詢計劃或執行後的實際查詢計劃。它會告訴你查詢的成本(我覺得CPU和IO成本很有趣)。如果幾乎沒有差別,我不會感到驚訝,但你永遠不知道。我看到某些查詢在我們的數據庫服務器上使用了多個核心,而同一個查詢的重寫版本只能使用一個核心(不用說,使用全部4個核心的查詢的速度提高了3倍)。從來沒有真正把我的手指放在這是爲什麼,但是如果你正在處理大型的結果集,那麼在你不知情的情況下會發生這種差異。
您是否說SELECT'A'WHERE'x'NOT IN(NULL,'a','b')會返回一個空的結果? – CJ7 2010-06-02 10:37:42
@克雷格 - 是的。 – 2010-06-02 10:38:37