Oracle数据库中的Where条件执行顺序是从后往前的?

先看下面的一小段代码

复制代码
  
  
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,
那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
例如:   
(低效)   
  SELECT
  FROM EMP E
  WHERE
SAL > 50000
  AND JOB = ‘MANAGER’
  AND 25 < ( SELECT COUNT ( * ) FROM EMP WHERE MGR = E.EMPNO);   
(高效)   
  SELECT
  FROM EMP E
  WHERE
  25 < ( SELECT COUNT ( * ) FROM EMP WHERE MGR = E.EMPNO)
  AND SAL > 50000
  AND JOB = ‘MANAGER’;
复制代码

 

举例说明:

 

  

复制代码
  
  
UPDATE XCSV_TEXT A SET ID05 = (
SELECT ( COUNT ( DISTINCT ID05) + 1 )
FROM XCSV_TEXT B
WHERE
B.ID04 IN ( ' MD ' , ' RT ' )
AND TO_NUMBER(B.ID05) < TO_NUMBER(A.ID05)

)

WHERE A.ID04 IN ( ' MD ' , ' RT ' );
复制代码

 

如果用这句代码来操作上面表中的数据,那么将会报错.

根据Oracle中Where条件的执行顺序,将会先执行TO_NUMBER(B.ID05) < TO_NUMBER(A.ID05)这一段, “Ver000017b65b65242dde1a9a014ac0e525ffb60”是不能To_Number的.

而改成

复制代码
  
  
UPDATE XCSV_TEXT A SET ID05 = (
SELECT ( COUNT ( DISTINCT ID05) + 1 )
FROM XCSV_TEXT B
WHERE
TO_NUMBER(B.ID05)
< TO_NUMBER(A.ID05)
AND B.ID04 IN ( ' MD ' , ' RT ' )

)

WHERE A.ID04 IN ( ' MD ' , ' RT ' );
复制代码

就正常了,而且提高了执行效率(至于为什么提高了执行效率,不做讨论.).

 

 结论:

       ORACLE采用自下而上的顺序解析WHERE子句,编写Where条件需要注意顺序,为了避免不必要的错误,也为了提高执行效率!


转自:http://www.cnblogs.com/yuanjw/archive/2010/03/04/1678093.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值