Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

<> vs. NICHT IN

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

prüft gegen jeden Wert in der Liste.

Allerdings ist NOT IN nicht NULL-tolerant. Wenn die Unterabfrage eine Reihe von Werten zurückgibt, die NULL enthalten, werden überhaupt keine Datensätze zurückgegeben. (Dies liegt daran, dass NOT IN intern auf idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL optimiert ist usw., die immer fehlschlagen, da jeder Vergleich mit NULL UNKNOWN ergibt und verhindert, dass der gesamte Ausdruck jemals TRUE wird.)

Eine schönere, NULL-tolerante Variante wäre diese:

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

EDIT:Ich bin zunächst davon ausgegangen, dass dies:

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

würde nur gegen den ersten Wert prüfen. Es stellt sich heraus, dass diese Annahme zumindest für SQL Server falsch ist, wo sie tatsächlich seinen Fehler auslöst:

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.