2016-08-15 5 views
1

の2つのコードブロックの違いを知りたいのですが、同じ結果が出るようです。INが<>(等しくない)と違い、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

2つは非常に異なりますが、ニュアンスは微妙な場合があります。テーブルのすべてのキーが一意で、NULLでない場合、両方が同じです。

しかし、重複があると、奇妙なことが起こる可能性があります。特定のペアについては、一方の行にA.Designation = 'Stylo'があり、他方にはありません。最初のクエリは、「他の行」に基づいて一致を返します。 2つ目は一致を返しません。

NumeroまたはClientNoのいずれかがNULLの場合です。 NOT INのリストのNULLの値は決してを返します。ロジックはFALSEまたはNULLを返します。この場合、2番目のクエリは、一致の有無にかかわらず、決して値を返しません。

より簡単なサンプルデータを生成することをお勧めします(1つのキーのみ使用)。次に、さまざまなシナリオを試して、それらがどのように異なるかを確認します。

+0

すばやく明確な回答をいただきありがとうございます。今は違いがあります。 –

関連する問題