with as短語,也叫做子查詢部分(subquery factoring),可以做很多事情,定義一個SQL片斷,該SQL片斷會被整個SQL語句所用到。With查詢語句不是以select開始的,而是以“WITH”關鍵字開頭,可認為在真正進行查詢之前預先構造了一個臨時表,之后便可多次使用它做進一步的分析和處理。有的時候,是為了讓SQL語句的可讀性更高些,也有可能是在UNION ALL的不同部分,作為提供數據的部分。
特別對於UNION ALL比較有用。因為UNION ALL的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用WITH AS短語,則只要執行一遍即可。如果WITH AS短語所定義的表名被調用兩次以上,則優化器會自動將WITH AS短語所獲取的數據放入一個TEMP表里,如果只是被調用一次,則不會。而提示materialize則是強制將WITH AS短語里的數據放入一個全局臨時表里。
一、with as的用法
1 --針對一個別名: 2 with tempName as (select ....) 3 select... 4 5 --針對多個別名: 6 with 7 tempName1 as (select ....), 8 tempName2 as (select ....), 9 tempName3 as (select ....) ... 10 select...
二、with as實例
1 --相當於建了個e臨時表 2 3 with e as (select * from scott.emp e where e.empno=7499) 4 5 select * from e; 6 7 --相當於建了e、d臨時表 8 9 with 10 11 e as (select * from scott.emp), 12 13 d as (select * from scott.dept) 14 15 select * from e, d where e.deptno = d.deptno;
三、with clause方法的優點
1.增加了SQL的易讀性,如果構造了多個子查詢,結構會更清晰;更重要的是:“一次分析,多次使用”,這也是為什么會提供性能的地方,達到了“少讀”的目標。
2.第一種使用子查詢的方法表被掃描了兩次,而使用WITH Clause方法,表僅被掃描一次。這樣可以大大的提高數據分析和查詢的效率。另外,觀察WITH Clause方法執行計划,其中“SYS_TEMP_XXXX”便是在運行過程中構造的中間統計結果臨時表。