Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

<> vs NÃO EM

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

verifica qualquer valor na lista.

No entanto, o NOT IN não é tolerante a NULL. Se a subconsulta retornasse um conjunto de valores contendo NULL, nenhum registro seria retornado. (Isso ocorre porque internamente o NOT IN é otimizado para idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL etc., que sempre falhará porque qualquer comparação com NULL produz UNKNOWN, impedindo que toda a expressão se torne TRUE.)

Uma variante mais agradável e tolerante a NULL seria esta:
SELECT something
FROM someTable
WHERE NOT EXISTS (SELECT ids FROM tmpIdTable WHERE ids = someTable.idcode)

EDIT:Eu inicialmente assumi que isso:
SELECT something
FROM someTable
WHERE idcode <> (SELECT ids FROM tmpIdTable)

verificaria apenas com o primeiro valor. Acontece que essa suposição está errada pelo menos para o SQL Server, onde na verdade aciona seu erro:
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.