2016-08-15 126 views
1

我想知道這兩個代碼塊之間有什麼區別,因爲對於我來說,它看起來會顯示相同的結果。IN與<>(不等於)和NOT IN與=(等於)之間的區別

我們正在查找「commande」表中沒有「stylo」文章的所有記錄。

SELECT Commande.Numero, Commande.ClientNo 
FROM Commande 
WHERE (Commande.Numero, Commande.ClientNo) IN (
    SELECT LigneCommande.CommandeNo, LigneCommande.ClientNo 
    FROM LigneCommande 
    INNER JOIN Article AS A 
    ON A.Numero = LigneCommande.ArticleNo 
    WHERE A.Designation <> 'Stylo') 

SELECT Commande.Numero, Commande.ClientNo 
FROM Commande 
WHERE (Commande.Numero, Commande.ClientNo) NOT IN (
    SELECT LigneCommande.CommandeNo, LigneCommande.ClientNo 
    FROM LigneCommande 
    INNER JOIN Article AS A 
    ON A.Numero = LigneCommande.ArticleNo 
    WHERE A.Designation = 'Stylo') 

回答

2

這兩者是非常不同的,但細微之處可能很微妙。如果表中的所有密鑰都是唯一且非空的,則兩者都是相同的。

但是,如果有重複,那麼可能會發生奇怪的事情。對於給定的一對,一行可能有A.Designation = 'Stylo'而另一行不可以。第一個查詢將返回一個基於「其他行」的匹配項。第二個不會返回匹配。

另一個區別是當NumeroClientNoNULL。 A NULLNOT IN從不返回true。該邏輯返回FALSE或NULL。在這種情況下,不管是否存在匹配,第二個查詢都不會返回值。

我建議你生成一些簡單的樣本數據(只使用一個鍵)。然後嘗試不同的場景以瞭解它們的不同之處。

+0

非常感謝您的快速和明確的答案,我現在得到了不同的結果! –

相關問題