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连接。 

等于还是不等于?

文章转自:http://xiaoyu1985ban.iteye.com/blog/1384191 看来看下面的一段代码:      代码片段1 Java代码   ...
  • a1259109679
  • a1259109679
  • 2015年06月04日 20:30
  • 210

Java迷题:等于,还是不等于?

等于还是不等于? 看来看下面的一段代码: 代码片段1 public static void main(final String[] args) {         Integer a = ne...
  • u012843873
  • u012843873
  • 2016年07月05日 10:49
  • 180

hibernate关于in和not in的查询

方法一: @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) public List OpUsrroleExLi...
  • shiqidide
  • shiqidide
  • 2012年03月07日 09:26
  • 17883

hive 中的 关系运算

1. 等值比较: =          语法:A=B          操作类型:所有基本类型          描述: 如果表达式A与表达式B相等,则为TRUE;否则为FALSE      ...
  • liuj2511981
  • liuj2511981
  • 2013年03月21日 16:57
  • 6696

mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)

1 ) . 大于,小于,大于或等于,小于或等于 $gt:大于 $lt:小于 $gte:大于或等于 $lte:小于或等于 例子: db.collection.find({ "fi...
  • forandever
  • forandever
  • 2015年03月30日 15:16
  • 5858

关于SpringDataJPA的一些小知识

SpringDataJPA让一切近乎完美SpringDataJPA主要针对的是Spring唯一没有简化到的业务逻辑的代码,连开发者仅剩的持久层的业务逻辑的工作都省了。唯一要做的就是申明持久层的接口,其...
  • Amethyst128
  • Amethyst128
  • 2017年06月10日 16:59
  • 451

Java迷题:等于,还是不等于?

表面上看来这只是一些基础的问题,当真正的了解了以后你就会发现:啊,原来是这么一回事!下文是几道Java谜题,不仔细分析就会犯错哦。 等于还是不等于? 看来看下面的一段代码: 代码片段...
  • Leolu007
  • Leolu007
  • 2013年03月13日 18:21
  • 586

Oracle中不等于号问题

在Oracle中,不等于号有以下几种方式: 测试SQLcreate table test( id int, name varchar2(10), age int ) insert int...
  • itmyhome
  • itmyhome
  • 2015年05月24日 23:31
  • 2880

Oracle中的不等于号

Oracle中的不等于号 标签: oraclenull测试sql 2012-07-21 00:45 49222人阅读 评论(3) 收藏 举报  分类:   Oracle(...
  • evilcry2012
  • evilcry2012
  • 2016年07月22日 08:45
  • 733
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:not in不等于not exists
举报原因:
原因补充:

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