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

<> vs NOT IN

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

kontrollerer mod enhver værdi på listen.

NOT IN er dog ikke NULL-tolerant. Hvis underforespørgslen returnerede et sæt værdier, der indeholdt NULL, ville ingen poster blive returneret overhovedet. (Dette skyldes, at NOT IN internt er optimeret til idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL osv., hvilket altid vil mislykkes, fordi enhver sammenligning med NULL giver Ukendt, hvilket forhindrer hele udtrykket i nogensinde at blive SAND.)

En pænere, NULL-tolerant variant ville være denne:

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

EDIT:Jeg antog oprindeligt, at dette:

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

ville kun tjekke mod den første værdi. Det viser sig, at denne antagelse er forkert i det mindste for SQL Server, hvor den faktisk udløser hans fejl:

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. Kan ikke AES_DECRYPT efter AES_ENCRYPT i mysql

  2. Forespørgselsudførelse

  3. Hvordan omdøber man noget i SQL Server, der har firkantede parenteser i navnet?

  4. For loop med dynamisk tabelnavn i Postgresql 9.1?