1. 程式人生 > >With tempTabel as (select...)臨時表的用法詳解

With tempTabel as (select...)臨時表的用法詳解

最近優化sql,發現這個臨時表真是個好東西。分享出來

(1)with基礎

使用WITH AS 語句可以為一個子查詢語句塊定義一個名稱,使用這個子查詢名稱可以在查詢語句的很多地方引用這個子查詢。Oracle 資料庫像對待內聯檢視或臨時表一樣對待被引用的子查詢名稱,從而起到一定的優化作用。with子句是9i新增語法。

你可以在任何一個頂層的SELECT 語句以及幾乎所有型別的子查詢語句前,使用子查詢定義子句。被定義的子查詢名稱可以在主查詢語句以及所有的子查詢語句中引用,但未定義前不能引用。

with子句中不能巢狀定義<也就是with子句中不能有with子句>,但子查詢中出現的子查詢定義語句可以引用已定義的子查詢名稱。<可以引用前面已經定義的with子句>

(2)with子句相關總結

1.使用with子句可以讓子查詢重用相同的with查詢塊,通過select呼叫(with子句只能被select查詢塊引用),一般在with查詢用到多次情況下。在引用的select語句之前定義,同級只能定義with關鍵字只能使用一次,多個用逗號分割。

2.with子句的返回結果存到使用者的臨時表空間中,只做一次查詢,反覆使用,提高效率。

3.在同級select前有多個查詢定義的時候,第1個用with,後面的不用with,並且用逗號隔開。

5.最後一個with 子句與下面的查詢之間不能有逗號,只通過右括號分割,with 子句的查詢必須用括號括起來

6.如果定義了with子句,而在查詢中不使用,那麼會報ora-32035 錯誤:未引用在with子句中定義的查詢名。(至少一個with查詢的name未被引用,解決方法是移除未被引用的with查詢),注意:只要後面有引用 的就可以,不一定非要在主查詢中引用,比如後面的with查詢也引用了,也是可以的。

7.前面的with子句定義的查詢在後面的with子句中可以使用。但是一個with子句內部不能巢狀with子句。

8.當一個查詢塊名字和一個表名或其他的物件相同時,解析器從內向外搜尋,優先使用子查詢塊名字。

9.with查詢的結果列有別名,引用的時候必須使用別名或*。

(3)with子句優點:

 1. SQL可讀性增強。比如對於特定with子查詢取個有意義的名字等。

 2. with子查詢只執行一次,將結果儲存在使用者臨時表空間中,可以引用多次,增強效能。
with子句語法:
With alias_name as (select1), –as和select中的括號都不能省略
alias_name2 as (select2),–後面的沒有with,逗號分割,同一個主查詢同級別地方,with子查詢只能定義一次
 …
alias_namen as (select n) –與下面的實際查詢之間沒有逗號
Select ….