not in不等于not exists

原创 2007年09月20日 18:21:00

请注意not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG:


请看下面的例子:
create table t1 (c1 number,c2 number);
create table t2 (c1 number,c2 number);

insert into t1 values (1,2);
insert into t1 values (1,3);
insert into t2 values (1,2);
insert into t2 values (1,null);

select * from t1 where c2 not in (select c2 from t2);
no rows found
select * from t1 where not exists (select 1 from t2 where t1.c2=t2.c2);
c1 c2
1 3

正如所看到的,not in 出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select语句的执行计划,也会不同。后者使用了hash_aj。
因此,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录,正如上面例子所示。
除非子查询字段有非空限制,这时可以使用not in ,并且也可以通过提示让它使用hasg_aj或merge_aj连接。 

相关文章推荐

sql语句中not in和exists 的用法以及更新两个表数据的插入实例

exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,exists : 强调的是是否返回结果集,不要求知道返回什么,...
  • dxnn520
  • dxnn520
  • 2016年10月29日 14:37
  • 1318

Oracle Null 与 in, exists 的关系说明(not in 查不到结果) ---转自:tianlesoftware

同事说查询遇到一个奇怪的事,2个表进行not in 操作没有返回结果,正常情况下应该是有返回的。   一.问题重现 一般来说,问题能重现就是好消息,最怕不能重现。   SQL> connsc...
  • kai27ks
  • kai27ks
  • 2012年07月15日 14:03
  • 615

oracle--not in查不到应有的结果(NULL、IN、EXISTS详解)

转载自:http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310708.html 问题: 语句1: Select * fro...

Oracle Null 与 in, exists 的关系说明(not in 查不到结果)

同事说查询遇到一个奇怪的事,2个表进行not in 操作没有返回结果,正常情况下应该是有返回的。   一.问题重现 一般来说,问题能重现就是好消息,最怕不能重现。   S...

Oracle Null 与 in, exists 的关系说明(not in 查不到结果)

同事说查询遇到一个奇怪的事,2个表进行not in 操作没有返回结果,正常情况下应该是有返回的。 一.问题重现一般来说,问题能重现就是好消息,最怕不能重现。 SQL> connscott/tiger;...

Oracle not in查不到应有的结果(NULL、IN、EXISTS详解)

首先我要感谢aa和Liu Xing帮我发现了我日志中的错误。之前比较粗心,把3条SQL语句写成一样的了,对于给读者造成的麻烦,我深表抱歉。 今天我把原文做了修订,为了对得起读者对我的关注,我重新...

Sql语句优化-查询两表不同行NOT IN、NOT EXISTS、连接查询Left Join

在实际开发中,我们往往需要比较两个或多个表数据的差别,比较那些数据相同那些数据不相同,这时我们有一下三种方法可以使用:1. IN或NOT IN,2. EXIST或NOTEXIST,3.使用连接查询(i...

NOT IN、NOT EXISTS的相关子查询改用LEFT JOIN--sql2000性能优化

参考文章:SQL SERVER性能优化综述(很好的总结,不要错过哦) 数据库:
  • twtiqfn
  • twtiqfn
  • 2014年08月15日 09:54
  • 3355

not in和not exists的区别

exists 和 in 的执行效率是一样的   很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无...

not in 与not exists的区别与用法

转载自http://blog.csdn.net/phantomes/article/details/12170805   在网上搜了下关于oracle中not exists和not in性能的比较,发...
  • xile99
  • xile99
  • 2013年11月06日 16:45
  • 897
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:not in不等于not exists
举报原因:
原因补充:

(最多只允许输入30个字)