2010-04-02 15 views
5

ich einige Zeit damit verbracht, diese Abfrage, um herauszufinden, warum nicht, um die Ergebnisse zieht i erwartet:Warum „nicht vorhanden“ SQL-Abfrage Arbeit und „nicht in“ nicht

SELECT * FROM NGS WHERE ESPSSN NOT IN (SELECT SSN FROM CENSUS) 

schließlich habe ich versucht, Das Schreiben der Abfrage einen anderen Weg und diese up endete die erwarteten Ergebnisse zu erzielen:

SELECT * FROM NGS n WHERE NOT EXISTS (SELECT * FROM CENSUS WHERE SSN = n.ESPSSN) 

Die erste Abfrage scheint besser geeignet und „richtig“. Ich benutze "in" und "nicht in" die ganze Zeit für ähnliche Auswahlen und hatte noch nie ein Problem , dass ich von kenne.

Antwort

11

Wenn Sie die syntaktische Zucker ausschreiben, x not in (1,2,3) wird:

x <> 1 AND x <> 2 AND x <> 3 

Wenn also die ssn Spalte einen Nullwert enthält, die erste Abfrage ist das Äquivalent von:

WHERE ESPSSN <> NULL AND ESPSSN <> ... 

Das Ergebnis Der Vergleich mit NULL ist unbekannt, daher würde die Abfrage nichts zurückgeben.

+0

Guter Anruf! Ich habe gerade überprüft und es gibt einen Nullwert in der Tabelle. Die Abfrage in SELECT * FROM NGS umschreiben, wo ESPSSN NICHT IN (SELECT ISNULL (SSN, '') FROM CENSUS) gab mir den erwarteten Wert. Ich frage mich, was soll ich verwenden? – Josh

+0

@Josh: Ich habe standardmäßig "nicht vorhanden", weil es nicht unter der "Null" -Gotcha leidet. Wenn Sie jedoch Leistungsprobleme haben, kann es sich lohnen, den Abfrageplan für beide Optionen zu prüfen. – Andomar

+0

@Josh, @Andomar: ISNULL wird die Verwendung eines Index ungültig machen, der möglicherweise vor – gbn

2

Wie Andomar sagte der NULL-Werte passen bei der Verwendung von NOT IN

Beachten Sie auch, dass eine Abfrage des NOT IN Prädikat verwendet wird immer verschachtelten Volltabellenscans durchführen, während eine Abfrage NOT EXISTS verwenden, können Sie einen Index innerhalb der Unterabfrage verwenden , und als Ergebnis viel schneller sein.

+0

verwendet wurde. Gut zu wissen. Vielen Dank. – Josh

Verwandte Themen