Oracle資料庫中的Where條件執行順序是從後往前的?
阿新 • • 發佈:2019-01-22
先看下面的一小段程式碼
ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連線必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾. 例如: (低效) SELECT … FROM EMP E WHERE SAL >50000AND JOB = ‘MANAGER’ AND25< (SELECTCOUNT(*) FROM EMP WHERE MGR=E.EMPNO); (高效) SELECT … FROM EMP E WHERE 25< (SELECT舉例說明:
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
就正常了,而且提高了執行效率(至於為什麼提高了執行效率,不做討論.).
結論:
ORACLE採用自下而上的順序解析WHERE子句,編寫Where條件需要注意順序,為了避免不必要的錯誤,也為了提高執行效率!