1. 程式人生 > >Oracle資料庫中的Where條件執行順序是從後往前的?

Oracle資料庫中的Where條件執行順序是從後往前的?

先看下面的一小段程式碼

複製程式碼 ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連線必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾. 例如:   (低效)    SELECTFROM EMP E WHERE SAL >50000AND JOB = ‘MANAGER’ AND25< (SELECTCOUNT(*) FROM EMP WHERE MGR=E.EMPNO);   (高效)   SELECTFROM EMP E WHERE 25< (SELECT
COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL >50000AND 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條件需要注意順序,為了避免不必要的錯誤,也為了提高執行效率!