Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

<> vs NON IN

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

confronta qualsiasi valore nell'elenco.

Tuttavia, NOT IN non è tollerante a NULL. Se la sottoquery restituiva un set di valori che conteneva NULL, non verrebbe restituito alcun record. (Questo perché internamente NOT IN è ottimizzato per idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL ecc., che fallirà sempre perché qualsiasi confronto con NULL restituisce SCONOSCIUTO, impedendo che l'intera espressione diventi TRUE.)

Una variante più piacevole e tollerante a NULL sarebbe questa:

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

EDIT:inizialmente pensavo che questo:

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

verificherebbe solo rispetto al primo valore. Si scopre che questa ipotesi è sbagliata almeno per SQL Server, dove in realtà attiva il suo errore:

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.