oracle的where条件里有不包括的条件吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle的where条件里有不包括的条件吗相关的知识,希望对你有一定的参考价值。

不包括可以用not in或者not exists
谈一下两者的区别:

not in 和not exists
not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG,请看下面的例子:

create table #t1(c1 int,c2 int);create table #t2(c1 int,c2 int);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);  -->执行结果:无select * from #t1 where not exists(select 1 from #t2 where #t2.c2=#t1.c2)  
-->执行结果:1  3

正如所看到的,not in出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select 语句的执行计划,也会不同,后者使用了hash_aj,所以,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用not in,并且可以通过提示让它用hasg_aj或merge_aj连接。
如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。
参考技术A where not exists

oracle sql查询求助

有一张表,每条数据是唯一的。按主键分组查询,其中一列值按条件判断。例如:select id,a from t where a>10 group by id; 现在问题是有不大于10的记录,我想这一列显示为0,请问除了用存储过程还能怎么弄?有函数能解决吗?急,在线等,麻烦了各位!

select id,case when a>10 then a else 0 end from t

是这个意思不?
参考技术A nvl函数可以解决 参考技术B 条件里有a>10,结果怎么会有不大于10的记录呢

以上是关于oracle的where条件里有不包括的条件吗的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 当两个表关联时,用where条件关联快还是用join on关联快,还有其他啥区别

如何优化Oracle在where条件中用了自定义函数的SQL语句

在数据库视图中应用动态 where 条件(oracle - 12c,mysql 5+)

我们给出 where 条件的顺序会影响性能吗? [复制]

rownum

如果满足 COUNT 条件,我可以应用 WHERE 子句吗?