sql之with as 公用表表示式

2021-07-14 11:19:19 字數 1185 閱讀 5603

sql 中的with as 具有強大的功能,特別是在有遞迴需要的情況下,一般來說結合union all一起用。

示例如下:

with w_users(userid) as  

( select userid from users where userid=

union all

select u.userid from users u,w_ext_users w where u.myupper=w.userid

) select sum(paymoney) from cost where users_ids in (

select userid from w_users

)) and

backtime between and and insuccess=1 and paysuccess=1"

1、with as 作為一種臨時表類似的機制,但是它只是將查詢結果集存在於記憶體中;

2、查詢的結果(本例中為w_users)必須在其後的第乙個sql(可以是增刪改查語句)語句中使用,後續的第二個便無效;

3、with as內的查詢不能有賦值操作;

4、with as 與()內的包含union all的查詢,可以構成複雜、功能強大的遞迴查詢。它把union all之前的語句第一次執行結果作為遞迴原點,當作存入w_users,然後再執行union all後面的遞迴語句得到結果集t0,並把它當作w_users;然後再執行union all後的遞迴語句,得到t1...直到返回集為空為止。然後把每一次的返回結果t0至tn的結果union all起來,即得到最後的w_users;

5、可以多個with as 連用,但是後續的只要用逗號及小括號連線即可;

6、with as前的最後乙個語句要以";"結束;

7、不能在 cte_query_definition 中使用以下子句:

(1)compute 或 compute by

(2)order by(除非指定了 top 子句)

(3)into

(4)帶有查詢提示的 option 子句

(5)for xml

(6)for browse

公用表表示式在查詢具有層次或者樹型結構的資料中相當有用。

另外,具有相似功能的sql特性有:臨時表、臨時表變數、中間表示式。

僅供參閱。

參見:

mysql8 WITH AS(公用表表示式)

公用表表示式 cte 是乙個命名的臨時結果集,它存在於單個語句的範圍內,以後可以在該語句中引用,可能多次。以下討論描述了如何編寫使用cte的語句。要指定公用表表示式,請使用 with具有乙個或多個逗號分隔子句的子句。每個子句都提供乙個子查詢,該子查詢產生乙個結果集,並將乙個名稱與該子查詢相關聯。下面...

公用表表示式

公用表表示式 common table expressions 假設我們有乙個100w條資料的訂單表,需要分頁查詢。declare rownumber asint,pagenumber asint set rownumber 5 set pagenumber 2 with orderedorders...

公用表表示式CTE

公用表表示式cte表面上和派生表非常相似,看起來只是語義上的區別。但和派生表比較起來,cte具有幾個優勢 第一,如果須要在乙個cte中引用另乙個cte,不需要像派生表那樣巢狀,相反,只要簡單地在同乙個with子句中定義多個cte,並用逗號把它們分隔開。每個cte可以引用在它前面定義的所有cte。而外...