sql >> Database >  >> RDS >> Sqlserver

<> vs NIET IN

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

controleert elke waarde in de lijst.

De NOT IN is echter niet NULL-tolerant. Als de subquery een set waarden retourneerde die NULL bevatten, zouden er helemaal geen records worden geretourneerd. (Dit komt doordat de NOT IN intern is geoptimaliseerd voor idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL enz., wat altijd zal mislukken omdat elke vergelijking met NULL ONBEKEND oplevert, waardoor wordt voorkomen dat de hele uitdrukking ooit WAAR wordt.)

Een mooiere, NULL-tolerante variant zou deze zijn:

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

EDIT:Ik ging er aanvankelijk van uit dat dit:

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

zou alleen tegen de eerste waarde controleren. Het blijkt dat deze veronderstelling onjuist is, althans voor SQL Server, waar het zijn fout daadwerkelijk veroorzaakt:

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. Waarden opvragen met jokertekens in PostgreSQL hstore

  2. Evolutie van fouttolerantie in PostgreSQL:replicatiefase

  3. Een PHP-script aanroepen vanuit een MySQL-trigger

  4. Zoekopdracht optimaliseren:DBMS_METADATA.GET_DDL (Oracle)