2009-11-09 12 views

Odpowiedz

5

Myślę, że służy temu samemu celowi.

not in może również brać wartości dosłowne, natomiast not exists potrzebować kwerendy, aby porównać wyniki.

Edycja: not exists może być dobrze w użyciu, ponieważ może join z zapytaniem zewnętrznej & może prowadzić do użycia wskaźnika, czy kryteria wykorzystuje kolumnę, która jest indeksowany.

EDIT2: Zobacz także pytanie: this.

EDIT3: Pozwól mi wziąć powyższe rzeczy z powrotem.
Zobacz link this. Wydaje mi się, że wszystko zależy od tego, jak DB tłumaczy to & w bazie danych/indeksach itp.

+0

Nie zapomnij o leczeniu null: http://stackoverflow.com/questions/1699424/what-the-difference -ponownie-nie-w-nie-istnieje-w-oracle-query/1703712 # 1703712 –

+0

Łącze Tom Kyte zdecydowanie dociera do źródła problemu. –

0

Mogą występować różnice w wydajności, a ich istnienie jest szybsze.

Najważniejszą różnicą jest obsługa wartości null. Twoje zapytanie może wyglądać tak samo, zarówno jeśli istnieje, jak i istnieje, ale gdy twoje pod-zapytanie zwróci wartość null, możesz doznać szoku.

Może się okazać, że istnienie przyczyn zerowych kończy się niepowodzeniem.

Zobacz "SQL for smarties" Joego Celko dla lepszego wyjaśnienia, kiedy należy ich używać.

0

Nie jest testowane pod kątem obecności elementu w zestawie elementów, więc jest prostsze.

Nie istnieje może obsłużyć bardziej skomplikowane zapytania, w tym grupowanie (np. Posiadanie sumy (x) = z lub zliczanie (*)> 3), wyniki z wieloma warunkami (np. Dopasowanie wielu elementów) i może korzystać z indeksów .

W niektórych sytuacjach nie jest łatwiejsze niż nie istnieje. Ogólnie uważam, że to tutaj testuję wartość pola klucza w zestawie wartości.

Z reguły kciuka, wolę nie istnieć, ponieważ obejmuje on więcej sytuacji niż nie ma. Nie istnieje może być używana w każdej sytuacji, która nie jest używana, ale nie na odwrót.

13

Różnica między NOT IN i NIE ISTNIEJE staje się jasne, gdzie istnieją NULL wartości ujęte w wyniku.

Na przykład:

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); 

Uwaga: Oni różnicą jest to, że klucz test_b zawiera wartość null.

select * from test_a where col1 not in (select col1 from test_b); 

Brak wiersze zwrócone

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: Myślę, że powinieneś zaakceptować tę odpowiedź, pomoże przyszłym gościom w bezpośrednim spojrzeniu. – hagrawal

Powiązane problemy