首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

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

2013-03-06 
Oracle数据库中的Where条件执行顺序是从后往前Oracle数据库中的Where条件执行顺序是从后往前的转自:http:/

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

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

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

?

先看下面的一小段代码

?

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,

那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

例如:   

(低效)   

?SELECT …????

?FROM EMP E????

?WHERE????????

??? SAL >50000????

?AND JOB = ‘MANAGER’????

?AND25< (SELECTCOUNT(*) FROM EMP WHERE MGR=E.EMPNO);   

(高效)   

?SELECT …????

?FROM EMP E????

?WHERE????????

???? 25< (SELECTCOUNT(*) 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

?

热点排行