2016-08-15 196 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

非常感谢您的快速和明确的答案,我现在得到了不同的结果! –