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。而外...