2011-04-15 66 views
29

有人請提供如何使用連接編寫以下sql查詢。我不想使用不在以及如果可能我想代替其中條件以及。如何使用連接編寫「不在()」sql查詢

SELECT d1.Short_Code 
FROM domain1 d1 
WHERE d1.Short_Code NOT IN (
    SELECT d2.Short_Code 
    FROM Domain2 d2 
) 

我使用SQL Server 2008

回答

45

文章:

可能是,如果您感興趣的。

在一對夫婦的話,這個查詢:

SELECT d1.short_code 
FROM domain1 d1 
LEFT JOIN 
     domain2 d2 
ON  d2.short_code = d1.short_code 
WHERE d2.short_code IS NULL 

將工作,但它比NOT NULL(或NOT EXISTS)構建效率較低。

您也可以使用此:

SELECT short_code 
FROM domain1 
EXCEPT 
SELECT short_code 
FROM domain2 

這既不使用也不NOT INWHERE(甚至沒有加入!),但是這將刪除domain1.short_code如果有所有重複。

+1

@Quassnoi,請您提供有效的方式書寫方式使用或者「NOT NULL」和/或「NOT EXISTS」 – Elangesh 2011-04-15 12:36:10

+1

@Elan相同的查詢:您原來的查詢是剛剛好。只需在兩個表中的'short_code'上創建索引。 – Quassnoi 2011-04-15 12:38:52

+0

@Quassnoi - 你假設他不需要任何來自domain2表的信息 – Aducci 2011-04-15 12:50:31

10
SELECT d1.Short_Code 
FROM domain1 d1 
LEFT JOIN domain2 d2 
ON d1.Short_Code = d2.Short_Code 
WHERE d2.Short_Code IS NULL 
1

在這種情況下,我會選擇NOT EXISTS

SELECT D1.ShortCode 
FROM Domain1 D1 
WHERE NOT EXISTS 
    (SELECT 'X' 
    FROM Domain2 D2 
    WHERE D2.ShortCode = D1.ShortCode 
    ) 
+0

'不存在'會產生什麼區別? – Quassnoi 2011-04-15 12:56:13

+0

優化程序應該使用兩個表之間的排除合併連接的等效替代外連接或複雜OR操作(使用NOT IN子句)。 – 2011-04-15 12:59:27

+2

優化器將爲'NOT IN'和'NOT EXISTS'構建完全相同的計劃(只要'short_code'不可空)。不會有「複雜的OR操作」。 – Quassnoi 2011-04-15 13:14:03