Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

<> vs PAS DANS

SELECT something
FROM someTable
WHERE idcode NOT IN (SELECT ids FROM tmpIdTable)

vérifie par rapport à n'importe quelle valeur de la liste.

Cependant, NOT IN n'est pas tolérant à NULL. Si la sous-requête renvoyait un ensemble de valeurs contenant NULL, aucun enregistrement ne serait renvoyé. (C'est parce qu'en interne le NOT IN est optimisé pour idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL etc., qui échouera toujours car toute comparaison avec NULL donne UNKNOWN, empêchant l'expression entière de devenir TRUE.)

Une variante plus agréable et tolérante à NULL serait celle-ci :

SELECT something
FROM someTable
WHERE NOT EXISTS (SELECT ids FROM tmpIdTable WHERE ids = someTable.idcode)

EDIT :J'ai d'abord supposé que ceci :

SELECT something
FROM someTable
WHERE idcode <> (SELECT ids FROM tmpIdTable)

vérifierait par rapport à la première valeur uniquement. Il s'avère que cette hypothèse est fausse au moins pour SQL Server, où elle déclenche en fait son erreur :

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.