2016-08-15 5 views
1

두 코드 블록의 차이점을 알고 싶습니다. 동일한 결과가 나타나는 것처럼 보입니다.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

두 가지가 매우 다르지만 미묘한 차이가있을 수 있습니다. 테이블의 모든 키가 고유하고 NULL이 아닌 경우 두 키가 동일합니다.

하지만 중복되는 경우 이상한 일이 발생할 수 있습니다. 주어진 쌍에 대해 하나의 행은 A.Designation = 'Stylo'이고 다른 행은 그렇지 않을 수 있습니다. 첫 번째 쿼리는 "다른 행"을 기반으로 일치 항목을 반환합니다. 두 번째는 일치를 반환하지 않습니다.

Numero 또는 ClientNoNULL입니다. NOT IN의 목록에있는 NULL 값은 결코을 반환합니다. 논리는 FALSE 또는 NULL을 반환합니다. 이 경우 두 번째 쿼리는 일치 항목의 유무에 관계없이 절대로 값을 반환하지 않습니다.

하나의 키만 사용하여 간단한 샘플 데이터를 생성하는 것이 좋습니다. 그런 다음 서로 다른 시나리오를 시험해 그들이 어떻게 다른지 확인하십시오.

+0

답장을 보내 주셔서 감사합니다. 지금은 차이점이 있습니다. –