not in , not exists 语句的N种写法

原创 2007年10月07日 01:47:00

今天,发现production上有一个SQL 耗了特多CPU time,于是抓了下来,看看是否可以tuning .

原始 SQL 如下(table名字改了一下):

 

第一种变换(not in)  

现在来试一下变换

用not in 代替 not exists


在9i 里面,Oracle把这个语句和前面的语句看为同一个语句,当然执行计划和执行时间也没有差别。

 

第二种变换(minus)

第二种变换(minus)

用minus,

把 not exists 部分先用minus去掉,再用in 来选择data。

 


(minus + distinct )

在 minus之前加个 distinct看看

 


可以用 in ,当然就可以用 exists 或者join 了(delete不好用join,只好改为SELECT)

 


除了上面几种,还有一种不是很常用的方法
就是(outer join + is null )(也是为了方便,先用SELECT来演示,)



 


看来最后一种是最有效哦
改成DELETE形式看看

 


 

quote:
最初由 rollingpig 发布
在 9i 里面,in 和 exists已经基本一样,Oracle会在内部自动作转换

倒是 我提到的其中几个转换值的深究

1。in / exists ==> join

2。Add distinct in IN Clause or subquery

3. Add condition where rownum < 2 in exists clause (这个忘了演示了)

4, not exists / not in ==> outrt join + is null condition



甚至,可以反过来转换,有时候也有意想不到的效果。

某些时候

1。join ==> in / exists

2. 去掉某些distinct

3. outrt join + is null condition ==> not exists / not in

正确的应该是
outer join + is null condition

 


not in , not exists 语句的N种写法

代码: DELETE FROM test_table_1 a  WHERE NOT EXISTS (SELECT *           FROM test_table_2 b    ...

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

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

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

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

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

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

多个字段的in 和 not in 及其替代写法(exists,not exists)

首先声明:数据库高手请走开,您看了碍眼啊! 有些时候进行查询的时候啊,一个字段的in、 not in根本不能满足要求,非常需要类似多个字段的in、not in,但是很多数据库不支持多个字段的in、 ...

NOT EXISTS替代NOT IN 和 EXISTS替换DISTINCT 识别‘低效执行’的SQL语句

用NOT EXISTS替代NOT IN    在子查询中,NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。 为...

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

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

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

问题: 语句1: Select * from  table1 A where A.col1 not in ( select col1 from table2 B ) 如果这样...

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

语句1: Select * from  table1 A where A.col1 not in ( select col1 from table2 B ) 如果这样,本来应该有一条数据,结果没...

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

同事说查询遇到一个奇怪的事,2个表进行not in 操作没有返回结果,正常情况下应该是有返回的。 一.问题重现一般来说,问题能重现就是好消息,最怕不能重现。 SQL> connscott/tiger;...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:not in , not exists 语句的N种写法
举报原因:
原因补充:

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