2009-11-09 103 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

相关问题