With語句的語法(AS後面的括號是不能夠空缺的)
1WITH<alias_name>AS (subquery_sql_statement)sql
2SELECT<column_name_list>FROM<alias>;數據庫
簡單的with語句:併發
WITH A AS
(SELECT*FROM DUAL)
SELECT*FROM Aide
注意,定義了WITH語句必須在後邊的查詢中使用,不然提示錯誤信息:
1WITH A AS函數
2 (SELECT*FROM DUAL)性能
3SELECT*FROM dual測試
(錯誤的緣由是由於沒有使用定義的WITH語句進行查詢)優化
兩個with語句的語法:spa
1WITH<alias_one>AS
2 (subquery_sql_statement),
3<alias_two>AS
4 (sql_statement_from_alias_one)
5SELECT<column_name_list>
6FROM<alias_one>, <alias_two>
7WHERE<join_condition>;xml
測試例子:
1WITH A AS
2 (SELECT*FROM DUAL),
3 B AS
4 (SELECT*FROM DUAL)
5SELECT*FROM B, A
當在FROM關鍵子後面沒有所有使用定義的WITH語句,他就會提示同上的錯誤信息:
(不可引用在with子句中定於的查詢)
在視圖中使用WITH語句進行鏈接:
1CREATEORREPLACEVIEW WITH_V AS
2WITH DEPT_V AS (SELECT*FROM DEPT),
3 EMP_V AS (SELECT*FROM EMP)
4SELECT D.DNAME,D.LOC,E.*FROM EMP_V E
5LEFTJOIN DEPT_V D
6ON D.DEPTNO = E.DEPTNO
使用WITH AS 語句能夠爲一個子查詢語句塊定義一個名稱,使用這個子查詢名稱能夠在查詢語句的不少地方引用這個子查詢。Oracle 數據庫像對待內聯視圖或臨時表同樣對待被引用的子查詢名稱,從而起到必定的優化做用。with子句是9i新增語法。你能夠在任何一個頂層的SELECT 語句以及幾乎全部類型的子查詢語句前,使用子查詢定義子句。被定義的子查詢名稱能夠在主查詢語句以及全部的子查詢語句中引用,但未定義前不能引用。with子句中不能嵌套定義<也就是with子句中不能有with子句>,但子查詢中出現的「子查詢定義」語句能夠引用已定義的子查詢名稱。<能夠引用前面已經定義的with子句>
WITH子句相關總結:
1、在同級select前有多個查詢定義的時候,第1個用with,後面的不用with,而且用逗號隔開。
2、最後一個with 子句與下面的查詢之間不能有逗號,只經過右括號分割,with 子句的查詢必須用括號括起來
3、若是定義了with子句,而在查詢中不使用,那麼會報ora-32035 錯誤:未引用在with子句中定義的查詢名。(至少一個with查詢的name未被引用,解決方法是移除未被引用的with查詢),注意:只要後面有引用的就能夠,不必定非要在主查詢中引用,好比後面的with查詢也引用了,也是能夠的。
4、前面的with子句定義的查詢在後面的with子句中可使用。可是一個with子句內部不能嵌套with子句。
5、with查詢的結果列有別名,引用的時候必須使用別名或*。
WITH語句的優勢:
(1). SQL可讀性加強。好比對於特定with子查詢取個有意義的名字等。
(2)、with子查詢只執行一次,將結果存儲在用戶臨時表空間中,能夠引用屢次,加強性能。
舉例:在進行導入EXCEL的過程當中,有時候,須要將數據存儲在臨時表中,當下一次在進行導入的時候,進行清除臨時表的數據,可是這時候,有時候發生併發問題的話,兩個用戶可能會分別操做對方的數據,因此,可能形成混亂,可是可使用WITH函數和UNION語句拼接一個SQL語句,存儲在SESSION中,當須要導出錯誤信息的時候,可使用該語句構造數據。
---------------------------WITH語句的使用例子:
1、查詢出部門的總薪水大於全部部門平均總薪水的部門。部門表s_dept,員工表s_emp。分析:作這個查詢,首先必須計算出全部部門的總薪水,而後計算出總薪水的平均薪水,再篩選出部門的總薪水大於全部部門總薪水平均薪水的部門。那麼第1 步with 查詢查出全部部門的總薪水,第2 步用with 從第1 步得到的結果表中查詢出平均薪水,最後利用這兩次的with 查詢比較總薪水大於平均薪水的結果,以下:
1WITH DEPT_COSTS AS--查詢出部門的總工資
2 (SELECT D.DNAME, SUM(E.SAL) DEPT_TOTAL
3FROMDEPT D, EMP E
4WHERE E.DEPTNO =D.DEPTNO
5GROUPBYD.DNAME),
6 AVE_COST AS--查詢出部門的平均工資,在後一個WITH語句中能夠引用前一個定義的WITH語句
7 (SELECTSUM(DEPT_TOTAL) /COUNT(*) AVG_SUM FROMDEPT_COSTS)
8SELECT * from AVE_COST