2009-11-09 107 views

回答

5

我認爲它的作用是一樣的。

not in可以取文字值,而not exists需要一個查詢來比較結果。

編輯:not exists可能是很好用,因爲它可以join與外部查詢&會導致指數的使用情況,如果標準使用被索引的字段。

EDIT2:另請參閱this問題。

編輯3:讓我把上述事情回來。
請參閱this鏈接。我認爲,這一切都取決於數據庫如何在數據庫/索引等上轉換此&。

+0

不要忘了處理空值:http://stackoverflow.com/questions/1699424/what-the-difference -oracle-in-and-not-exist-in-oracle-query/1703712#1703712 – 2009-11-09 20:52:04

+0

湯姆凱特鏈接肯定得到了問題的根源。 – 2009-11-09 20:53:41

0

可能存在性能差異,存在速度更快。

最重要的區別是處理空值。您的查詢看起來可能與in和exists一樣,但是當您的子查詢返回null時,您可能會感到震驚。

您可能會發現存在空值導致存在失敗。

請參閱Joe Celko的'用於聰明人的SQL'以更好地解釋何時使用每一個。

0

不在爲一組元素中的元素進行測試,因此它更簡單。

不存在可以處理更復雜的查詢,包括分組(例如具有sum(x)= z或具有count(*)> 3),具有多個條件(例如,匹配多個元素)的結果,並且可以利用索引。

在某些情況下不容易做比不存在。我通常會發現這是我測試值集合中關鍵字段值的位置。

作爲一個大拇指的規則,我寧願不存在,因爲它涵蓋了更多的情況而不是不存在。不存在可以用於每個不用於的情況,但不是相反。

13

NOT IN之間的差異和NOT EXISTS那裏有包括在結果NULL值變得清晰。

例如:

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

注意:它們主要的區別在於test_b包含null值。

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

沒有行返回

select * from test_a where 
    not exists 
     (select 1 from test_b where test_b.col1 = test_a.col1); 

返回

col1 
==== 
d 
e 
+0

@金:我認爲你應該接受這個答案,將有助於未來的遊客直接得到公牛的眼睛。 – hagrawal 2017-11-19 18:10:59

相關問題