sql >> Base de Datos >  >> RDS >> Sqlserver

<> frente a NO DENTRO

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

comprueba cualquier valor de la lista.

Sin embargo, NOT IN no es tolerante a NULL. Si la subconsulta devuelve un conjunto de valores que contienen NULL, no se devolverá ningún registro. (Esto se debe a que internamente NOT IN está optimizado para idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL etc., que siempre fallará porque cualquier comparación con NULL arroja DESCONOCIDO, lo que impide que la expresión completa se vuelva VERDADERA).

Una variante más agradable y tolerante a NULL sería esta:

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

EDITAR:Inicialmente asumí que esto:

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

verificaría contra el primer valor solamente. Resulta que esta suposición es incorrecta al menos para SQL Server, donde en realidad desencadena su error:

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.