2010-10-28 2 views
1

Pourquoi ces requêtes renvoient les résultats de la différence:T-SQL: Question sur NOT IN

SELECT * 
    FROM ProjectStatus PS 
WHERE 0 = (SELECT COUNT(*) 
       FROM Project P 
      WHERE P.ProjectStatusKey = PS.ProjectStatusKey) 

SELECT * 
    FROM ProjectStatus PS 
WHERE PS.ProjectStatusKey NOT IN (SELECT P.ProjectStatusKey 
            FROM Project P) 
+0

Est-ce que l'une des colonnes ProjectStatusKey accepte les valeurs NULL? À première vue, je ne vois pas pourquoi ils retourneraient des résultats différents à moins que les deux colonnes n'acceptent des valeurs NULL, et qu'elles soient traitées différemment selon les deux scénarios. –

Répondre

3

Ugh. Il s'avère que c'est la NULL dans la liste des options qui brise toute la foutue chose. Vous devez soit désactiver NULLs ANSI ou modifier la requête à cette ...

SELECT * FROM ProjectStatus PS WHERE 
    PS.ProjectStatusKey NOT IN (SELECT P.ProjectStatusKey FROM Project P WHERE P.ProjectStatusKey IS NOT NULL) 
+0

Je voulais simplement vous suggérer quelque chose comme ça.^_^ – Eilistraee

+0

Ces darn NULLs causer plus de problèmes. – DOK

0

Si l'une de vos valeurs Project.ProjectStatusKey sont NULL, la clause NOT IN évaluerait à NULL et au lieu de VRAI/FAUX .