2015-04-23 70 views
1

我在學習SQL的幾個星期後,剛剛完成了有關使用IN和NOT IN的作業任務的問題。我設法得到了正確的答案,但是,我使用了EXCEPT子句,我們還沒有真正允許使用它。從我所知道的來看,EXCEPT和NOT IN在SQL中是非常相似的語句,但我不明白它們有什麼區別。這裏是我的查詢的一般格式:有沒有辦法將EXCEPT語句重寫爲SQL中的NOT IN語句?

SELECT * 
FROM table 
WHERE x IN (
    SELECT x 
    /* ... some subquery*/ 
    EXCEPT 
    SELECT x 
    /* ... some other subquery*/ 
) 

有沒有辦法重寫這個通用查詢而不使用EXCEPT語句?一般情況下,EXCEPT和NOT IN如何不同?

編輯:This other post似乎有一些很好的信息,但它似乎集中於EXISTS而不是IN,它們有不同的目的嗎?

回答

4

這可以幫助你瞭解除了與否的差異

EXCEPT運算符返回從左側表中的所有不同的行不以右側表中。

另一方面,「NOT IN」將返回左側表中不存在於右側表中的所有行,但它不會從結果中刪除重複行。

+0

這很有道理!非常感謝你! – Kyle

1

SQL是一種聲明性語言。因此,有許多構造可以轉化爲相同的關係代數樹/執行計劃。例如,可以使用INNER JOIN或CROSS JOIN + WHERE或+,WHERE或LEFT/RIGHT JOIN + WHERE指定內部聯接。

EXCEPT/INTERSECT是設置運算符,而IN/NOT IN是謂詞。考慮你的榜樣,

SELECT * 
FROM table 
WHERE x IN (
    SELECT x 
    /* ... some subquery*/ 
    EXCEPT 
    SELECT x 
    /* ... some other subquery*/ 
) 

這可以寫成使用IN/NOT IN,如:

SELECT * 
FROM table as t1 
WHERE t1.x IN (
    SELECT t2.x 
    FROM t2 
    WHERE t2.x NOT IN (
         SELECT t3.x 
         FROM t3 
    ) 
) 

現在,在語法方面的這些意思是相同的,但在語義上它們可能不會產生相同的結果。例如,如果列X是可以爲空的,那麼NOT IN將產生不同的結果。

最後,對於簡單情況,如果您查看SQL Server Management Studio中針對這兩個查詢的執行計劃,您會發現它們使用了類似的計劃/連接策略。這是因爲SQL Server會將語法轉換爲經過優化以生成執行計劃的關係樹。在翻譯之後,最終計劃對於不同的查詢可能是相同的。

相關問題