打印本文 打印本文 关闭窗口 关闭窗口
Oracle常見問題集(三)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数6583  更新时间:2009/4/22 22:05:50  文章录入:mintao  责任编辑:mintao
RETURN (NVL(ENAME, ));

END;

 

SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),

H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)

FROM EMP_HISTORY H

GROUP BY H.EMPNO , H.HIST_TYPE;

 

(譯者按: 經常在論壇中看到如 ’能不能用一個SQL寫出…. 的貼子, 殊不知複雜的SQL往往犧牲了執行效率.

能夠掌握上面的運用函數解決問題的方法在實際工作中是非常有意義的)

 

17. 使用表的別名(Alias)

當在SQL語句中連接多個表時,

請使用表的別名並把別名字首於每個Column.這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤.

 

(譯者注:

Column歧義指的是由於SQL中不同的表具有相同的Column,SQL語句中出現這個Column,SQL解析器無法判斷這個Column的歸屬)

 

18. EXISTS替代IN

在許多基於基礎表的查詢中,爲了滿足一個條件,往往需要對另一個表進行聯接.在這種情況下, 使用EXISTS(NOT

EXISTS)通常將提高查詢的效率.

 

低效:

SELECT *

FROM EMP (基礎表)

WHERE EMPNO > 0

AND DEPTNO IN (SELECT DEPTNO

FROM DEPT

WHERE LOC = MELB)

 

高效:

SELECT *

FROM EMP (基礎表)

WHERE EMPNO > 0

AND EXISTS (SELECT X

FROM DEPT

WHERE DEPT.DEPTNO = EMP.DEPTNO

AND LOC = MELB)

(譯者按: 相對來說,NOT EXISTS替換NOT IN 將更顯著地提高效率,下一節中將指出)

19. NOT EXISTS替代NOT IN

在子查詢中,NOT IN子句將執行一個內部的排序和合併. 無論在哪種情況下,NOT IN都是最低效的

(因爲它對子查詢中的表執行了一個全表遍曆). 爲了避免使用NOT IN ,我們可以把它改寫成外連接(Outer Joins)NOT

EXISTS.

 

例如:

SELECT

FROM EMP

WHERE DEPT_NO NOT IN (SELECT DEPT_NO

FROM DEPT

WHERE DEPT_CAT=A);

 

爲了提高效率.改寫爲:

 

(方法一: 高效)

SELECT .

FROM EMP A,DEPT B

WHERE A.DEPT_NO = B.DEPT(+)

AND B.DEPT_NO IS NULL

AND B.DEPT_CAT(+) = A

(方法二:

 << 上一页  [11] [12] [13]  下一页

打印本文 打印本文 关闭窗口 关闭窗口