SELECT something
FROM someTable
WHERE idcode NOT IN (SELECT ids FROM tmpIdTable)
porovnává s jakoukoli hodnotou v seznamu.
NOT IN však nesnáší hodnotu NULL. Pokud dílčí dotaz vrátil sadu hodnot obsahujících NULL, nebudou vráceny vůbec žádné záznamy. (Je to proto, že vnitřně je NOT IN optimalizováno na idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL
atd., což vždy selže, protože jakékoli srovnání s hodnotou NULL vede k NEZNÁMÉMU, což zabrání tomu, aby se celý výraz stal PRAVDIVÝ.)
Hezčí varianta s tolerancí NULL by byla tato:
SELECT something
FROM someTable
WHERE NOT EXISTS (SELECT ids FROM tmpIdTable WHERE ids = someTable.idcode)
EDIT:Původně jsem předpokládal, že toto:
SELECT something
FROM someTable
WHERE idcode <> (SELECT ids FROM tmpIdTable)
porovnává pouze s první hodnotou. Ukazuje se, že tento předpoklad je špatný přinejmenším pro SQL Server, kde ve skutečnosti spouští jeho chybu:
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.