2009-11-09 6 views

Antwort

5

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.

+0

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 –

+0

Der Tom Kyte Link kommt definitiv zur Wurzel der Sache. –

0

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.

0

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.

13

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 
+0

@Gold: Ich denke, dass Sie diese Antwort akzeptieren sollten, wird zukünftigen Besuchern helfen, das Volltreffer direkt zu bekommen. – hagrawal

Verwandte Themen