先看下面的一小段代碼
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條件需要注意順序,為了避免不必要的錯誤,也為了提高執行效率!