sql >> Databasteknik >  >> RDS >> Sqlserver

<> vs NOT IN

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

kontrollerar mot alla värden i listan.

NOT IN är dock inte NULL-tolerant. Om underfrågan returnerade en uppsättning värden som innehöll NULL, skulle inga poster returneras alls. (Detta beror på att NOT IN internt är optimerad till idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL etc., vilket alltid kommer att misslyckas eftersom varje jämförelse med NULL ger OKÄNT, vilket förhindrar att hela uttrycket någonsin blir SANT.)

En snyggare, NULL-tolerant variant skulle vara denna:

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

EDIT:Jag antog först att detta:

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

kontrollerar endast mot det första värdet. Det visar sig att detta antagande är fel åtminstone för SQL Server, där det faktiskt utlöser hans fel:

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.


  1. Analys av datum med olika tidszoner

  2. Oracle + dbunit får AmbiguousTableNameException

  3. Ge privilegier för en viss databas i PostgreSQL

  4. Korstabelltransponeringsförfrågan