SELECT something
FROM someTable
WHERE idcode NOT IN (SELECT ids FROM tmpIdTable)
sprawdza dowolną wartość na liście.
Jednak NOT IN nie toleruje wartości NULL. Jeśli podzapytanie zwróciło zestaw wartości, które zawierały NULL, żadne rekordy nie zostałyby zwrócone. (Dzieje się tak, ponieważ wewnętrznie NOT IN jest zoptymalizowane do idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL
itp., co zawsze się nie powiedzie, ponieważ każde porównanie z wartością NULL daje wynik NIEZNANE, uniemożliwiając, aby całe wyrażenie kiedykolwiek stało się PRAWDĄ).
Ładniejszy wariant tolerujący NULL byłby następujący:
SELECT something
FROM someTable
WHERE NOT EXISTS (SELECT ids FROM tmpIdTable WHERE ids = someTable.idcode)
EDYCJA:Początkowo zakładałem, że to:
SELECT something
FROM someTable
WHERE idcode <> (SELECT ids FROM tmpIdTable)
sprawdzi tylko pierwszą wartość. Okazuje się, że to założenie jest błędne przynajmniej w przypadku SQL Server, gdzie faktycznie powoduje jego błąd:
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.