2010-06-02 99 views
20

是下面最高效的SQL實現其結果是:SQL:... WHERE X IN(選擇Y FROM ...)

SELECT * 
    FROM Customers 
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS) 

莫非一些使用的連接更好,達到同樣的結果?

回答

6

原因之一,你可能更願意使用一個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

≡未知

+0

您是否說SELECT'A'WHERE'x'NOT IN(NULL,'a','b')會返回一個空的結果? – CJ7 2010-06-02 10:37:42

+2

@克雷格 - 是的。 – 2010-06-02 10:38:37

2

也許嘗試這個

Select cust.* 

From dbo.Customers cust 
Left Join dbo.Subscribers subs on cust.Customer_ID = subs.Customer_ID 
Where subs.Customer_Id Is Null 
9

任何足夠成熟的SQL數據庫應能同樣有效地執行,作爲等價JOIN。使用任何更易讀的東西。

+4

+1這是正確的 - SQL Server將「NOT IN」和「NOT EXISTS」類型的查詢變成相同的執行計劃。 – eddiegroves 2010-06-02 10:41:38

3
SELECT Customers.* 
    FROM Customers 
WHERE NOT EXISTS (
     SELECT * 
     FROM SUBSCRIBERS AS s 
     JOIN s.Cust_ID = Customers.Customer_ID) 

當使用「NOT IN」,該查詢執行嵌套全表掃描,而對於「NOT EXISTS」,查詢可以在子查詢中使用的索引。

+2

取決於數據庫 - SQL Server將生成相同的執行計劃並執行索引查找(其中索引存在) – eddiegroves 2010-06-02 10:43:22

0

如果您想知道哪個更有效,應該嘗試查看估計的查詢計劃或執行後的實際查詢計劃。它會告訴你查詢的成本(我覺得CPU和IO成本很有趣)。如果幾乎沒有差別,我不會感到驚訝,但你永遠不知道。我看到某些查詢在我們的數據庫服務器上使用了多個核心,而同一個查詢的重寫版本只能使用一個核心(不用說,使用全部4個核心的查詢的速度提高了3倍)。從來沒有真正把我的手指放在這是爲什麼,但是如果你正在處理大型的結果集,那麼在你不知情的情況下會發生這種差異。

相關問題