Ich denke, dass es dem gleichen Zweck dient.
not in
kann auch Literalwerte annehmen, während not exists
eine Abfrage benötigt, um die Ergebnisse mit zu vergleichen.
EDIT: not exists
könnte gut sein, weil es join
mit der äußeren Abfrage & amp; kann zur Verwendung des Index führen, wenn das Kriterium eine indexierte Spalte verwendet.
EDIT2: Siehe auch diese Frage.
EDIT3: Lassen Sie mich die obigen Dinge zurücknehmen.
Siehe diesen Link. Ich denke, es hängt alles davon ab, wie die DB das übersetzt & amp; auf Datenbank / Indizes etc.
Der Unterschied zwischen NOT IN und NOT EXISTS wird klar, wenn NULL
-Werte im Ergebnis enthalten sind.
Zum Beispiel:
%Vor% Hinweis : Der Hauptunterschied besteht darin, dass test_b
einen null
-Wert enthält.
Keine Zeilen zurückgegeben
%Vor%Gibt
zurück %Vor%Nicht in testet das Vorhandensein eines Elements in einem Satz von Elementen, also ist es einfacher.
Not exists kann kompliziertere Abfragen verarbeiten, einschließlich der Gruppierung (z. B. mit sum (x) = z oder mit count (*) & gt; 3), Ergebnissen mit mehreren Bedingungen (z. B. das Zuordnen mehrerer Elemente) und kann Indizes nutzen .
In manchen Situationen ist es nicht einfacher zu tun, als es nicht gibt. Ich finde im Allgemeinen, dass ich hier für den Wert eines Schlüsselfeldes in einer Menge von Werten teste.
Als Daumenregel bevorzuge ich nicht, da es viel mehr Situationen umfasst als nicht. Nicht vorhanden kann für jede Situation verwendet werden, für die nicht in, aber nicht umgekehrt.
Es kann zu Leistungsunterschieden kommen, da es schneller besteht.
Der wichtigste Unterschied ist der Umgang mit Nullen. Ihre Abfrage scheint sowohl mit "in" als auch "exist" identisch zu sein. Wenn Ihre Unterabfrage jedoch null zurückgibt, können Sie einen Schock bekommen.
Sie könnten feststellen, dass die Existenz von Nullen als Ursache fehlschlägt.
Siehe Joe Celkos "SQL for Smarties" für eine bessere Erklärung, wann sie jeweils zu verwenden sind.