Was ist der Unterschied zwischen not in
und not exists
in einer Oracle-Abfrage?Was ist der Unterschied zwischen "nicht in" und "nicht existiert"?
Wann verwende ich not in
? Und not exist
?
Was ist der Unterschied zwischen not in
und not exists
in einer Oracle-Abfrage?Was ist der Unterschied zwischen "nicht in" und "nicht existiert"?
Wann verwende ich not in
? Und not exist
?
Ich denke, es dient dem gleichen Zweck.
not in
kann auch nehmen Literalwerte während not exists
eine Abfrage müssen mit den Ergebnissen zu vergleichen.
EDIT: not exists
könnte gut sein, weil es join
mit der äußeren Abfrage kann verwenden & Verbrauch von Index führen kann, wenn die Kriterien Spalte verwendet, die indiziert ist.
EDIT2: Siehe auch this Frage.
EDIT3: Lassen Sie mich die oben genannten Dinge zurücknehmen.
Siehe this Link. Ich denke, es hängt alles davon ab, wie die DB diese & auf Datenbank/Indizes etc. übersetzt.
Es kann Leistungsunterschiede geben, mit denen es schneller geht.
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 das Vorhandensein von NULL-Ursachen fehlschlägt.
Siehe Joe Celko 'SQL für Smarties' für eine bessere Erklärung, wann sie zu verwenden.
Nicht in testet für die Gegenwart eines Elements in einer Reihe von Elementen, so dass es einfacher ist.
Not exists kann komplexere Abfragen verarbeiten, einschließlich Gruppierung (zB mit sum (x) = z oder mit count (*)> 3), Ergebnissen mit mehreren Bedingungen (z. B. mehrere Elemente) und kann Indizes nutzen .
In einigen Situationen ist es nicht einfacher zu tun, als es nicht gibt. Im Allgemeinen finde ich, dass ich hier den Wert eines Schlüsselfelds in einer Menge von Werten überprüfe.
Als eine Faustregel, ich bevorzuge nicht existiert, da es viel mehr Situationen als nicht umfasst. Nicht existiert kann für jede Situation verwendet werden, die nicht für verwendet wird, aber nicht umgekehrt.
Der Unterschied zwischen NICHT IN und NICHT VORHANDEN klar wird, wo es NULL
Werte im Ergebnis enthalten.
Zum Beispiel:
create table test_a (col1 varchar2(30 char));
create table test_b (col1 varchar2(30 char));
insert into test_a (col1) values ('a');
insert into test_a (col1) values ('b');
insert into test_a (col1) values ('c');
insert into test_a (col1) values ('d');
insert into test_a (col1) values ('e');
insert into test_b (col1) values ('a');
insert into test_b (col1) values ('b');
insert into test_b (col1) values ('c');
insert into test_b (col1) values (null);
Hinweis: Sie wesentliche Unterschied besteht darin, dass test_b
enthält einen null
Wert.
select * from test_a where col1 not in (select col1 from test_b);
keine Zeilen zurückgegeben
select * from test_a where
not exists
(select 1 from test_b where test_b.col1 = test_a.col1);
Returns
col1
====
d
e
@Gold: Ich denke, dass Sie diese Antwort akzeptieren sollten, wird zukünftigen Besuchern helfen, das Volltreffer direkt zu bekommen. – hagrawal
Vergessen Sie nicht über die Behandlung von NULL-Werte: http://stackoverflow.com/questions/1699424/what-the-difference -zwischen-nicht-in-und-nicht-existiert-in-oracle-querfrage/1703712 # 1703712 –
Der Tom Kyte Link kommt definitiv zur Wurzel der Sache. –