oracle with as 的用法

介紹with的語法[@more@]php

 

本文參考網址:http://psoug.org/reference/with.htmlhtml

http://www.oracle-base.com/articles/misc/with-clause.phpsql

http://gennick.com/with.html ------Understanding the WITH Claus數據庫

參考文檔下載地址:http://ishare.iask.sina.com.cn/f/21674385.html併發

The WITH query_name clause lets you assign a name to a subquery block. You can then reference the subquery block multiple places in the query by specifying the query name. Oracle optimizes the query by treating the query name as either an inline view or as a temporary table.
(WITH語句只能位於一條語句的最頂級)
You can specify this clause in any top-level SELECT statement and in most types of subqueries. The query name is visible to the main query and to all subsequent subqueries except the subquery that defines the query name itself.

A WITH clause is really best used when the result of the WITH query is required more than one time in the body of the query such as where one averaged value needs to be compared against two or three times.

Restrictions on Subquery Factoring:oracle

· You cannot nest this clause. That is, you cannot specify the subquery_factoring_clause within the subquery of another subquery_factoring_clause. However, a query_name defined in one subquery_factoring_clause can be used in the subquery of any subsequent subquery_factoring_clause.(WITH語句不容許嵌套,以前定義的WITH語句能夠在它後面的任何一個WITH語句中使用)函數

· In a query with set operators, the set operator subquery cannot contain the subquery_factoring_clause, but the FROM subquery can contain the subquery_factoring_clause性能

With語句的語法(AS後面的括號是不能夠空缺的)
1 WITH <alias_name> AS (subquery_sql_statement)測試

2 SELECT <column_name_list> FROM <alias>;優化

簡單的with語句:

WITH A AS
(SELECT * FROM DUAL)
SELECT * FROM A

注意,定義了WITH語句必須在後邊的查詢中使用,不然提示錯誤信息:
1 WITH A AS

2 (SELECT * FROM DUAL)

3 SELECT * FROM dual

 

(錯誤的緣由是由於沒有使用定義的WITH語句進行查詢)

 

兩個with語句的語法:

 

1 WITH <alias_one> AS
2 (subquery_sql_statement),
3 <alias_two> AS
4 (sql_statement_from_alias_one)
5 SELECT <column_name_list>
6 FROM <alias_one>, <alias_two>
7 WHERE <join_condition>;

 

測試例子:

1 WITH A AS

2 (SELECT * FROM DUAL),

3 B AS

4 (SELECT * FROM DUAL)

5 SELECT * FROM B, A

當在FROM關鍵子後面沒有所有使用定義的WITH語句,他就會提示同上的錯誤信息:

(不可引用在with子句中定於的查詢)
 

 

在視圖中使用WITH語句進行鏈接:
1 CREATE OR REPLACE VIEW WITH_V AS
2 WITH DEPT_V AS (SELECT * FROM DEPT),
3 EMP_V AS (SELECT * FROM EMP)
4 SELECT D.DNAME,D.LOC,E.* FROM EMP_V E
5 LEFT JOIN DEPT_V D
6 ON D.DEPTNO = E.DEPTNO

 

使用WITH AS 語句能夠爲一個子查詢語句塊定義一個名稱,使用這個子查詢名稱能夠 在查詢語句的不少地方引用這個子查詢。Oracle 數據庫像對待內聯視圖或臨時表同樣對待 被引用的子查詢名稱,從而起到必定的優化做用。with子句是9i新增語法。你能夠在任何一個頂層的SELECT 語句以及幾乎全部類型的子查詢語句前,使用子查詢定義子句。被定義的子查詢名稱能夠在主查詢語句以及全部的子查詢語句中引用,但未定義前不能引用。with子句中不能嵌套定義<也就是with子句中不能有with子句>,但子查詢中出現的「子查詢定義」語句能夠引用已定義的子查詢名稱。<能夠引用前面已經定義的with子句>

WITH子句相關總結:

 

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

 

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

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

 

四、前面的with子句定義的查詢在後面的with子句中可使用。可是一個with子句內部不能嵌套with子句。

 

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

 

WITH語句的優勢:

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

(2)、with子查詢只執行一次,將結果存儲在用戶臨時表空間中,能夠引用屢次,加強性能。

舉例:在進行導入EXCEL的過程當中,有時候,須要將數據存儲在臨時表中,當下一次在進行導入的時候,進行清除臨時表的數據,可是這時候,有時候發生併發問題的話,兩個用戶可能會分別操做對方的數據,因此,可能形成混亂,可是可使用WITH函數和UNION語句拼接一個SQL語句,存儲在SESSION中,當須要導出錯誤信息的時候,可使用該語句構造數據。

---------------------------WITH語句的使用例子:

一、查詢出部門的總薪水大於全部部門平均總薪水的部門。部門表s_dept,員工表s_emp。分析:作這個查詢,首先必須計算出全部部門的總薪水,而後計算出總薪水的平均薪水,再篩選出部門的總薪水大於全部部門總薪水平均薪水的部門。那麼第1 步with 查詢查出全部部門的總薪水,第2 步用with 從第1 步得到的結果表中查詢出平均薪水,最後利用這兩次 的with 查詢比較總薪水大於平均薪水的結果,以下:

 

1 WITH DEPT_COSTS AS --查詢出部門的總工資

2 (SELECT D.DNAME, SUM(E.SAL) DEPT_TOTAL

3 FROM DEPT D, EMP E

4 WHERE E.DEPTNO = D.DEPTNO

5 GROUP BY D.DNAME),

6 AVE_COST AS --查詢出部門的平均工資,在後一個WITH語句中能夠引用前一個定義的WITH語句

7 (SELECT SUM(DEPT_TOTAL) / COUNT(*) AVG_SUM FROM DEPT_COSTS)

8 SELECT

相關文章
相關標籤/搜索