Jaka jest różnica między not in
i not exists
w zapytaniu Oracle?Jaka jest różnica między "nie w" i "nie istnieje"?
Kiedy korzystać z not in
? I not exist
?
Jaka jest różnica między not in
i not exists
w zapytaniu Oracle?Jaka jest różnica między "nie w" i "nie istnieje"?
Kiedy korzystać z not in
? I not exist
?
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.
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ć.
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.
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
@Gold: Myślę, że powinieneś zaakceptować tę odpowiedź, pomoże przyszłym gościom w bezpośrednim spojrzeniu. – hagrawal
Nie zapomnij o leczeniu null: http://stackoverflow.com/questions/1699424/what-the-difference -ponownie-nie-w-nie-istnieje-w-oracle-query/1703712 # 1703712 –
Łącze Tom Kyte zdecydowanie dociera do źródła problemu. –