下面看在cte中分配列別名的兩種格式:內聯格式和外部格式。
內聯格式:
1with c as2(
3select
year(orderdate) as
orderyear, custid
4from
sales.orders5)
6select orderyear, count(distinct custid) as
numcusts
7fromc8
group
by orderyear;
外部格式:
1with c(orderyear, custid) as2(
3select
year
(orderdate), custid
4from
sales.orders5)
6select orderyear, count(distinct custid) as
numcusts
7fromc8
group
by orderyear;
定義多個cte只需要在同乙個with子句中用逗號把它們分隔開即可。每個cte可以引用在它前面定義的所有cte,而外部查詢則可以引用所有cte,例如:
1with c1 as2(
3select
year(orderdate) as
orderyear, custid
4from
sales.orders5),
6 c2 as7(
8select orderyear, count(distinct custid) as
numcusts
9from
c110
group
byorderyear11)
12select
orderyear, numcusts
13from
c214
where numcusts >
70;
cte還可以實現對資料的遞迴查詢。以下**演示了如何使用遞迴cte來返回有關某個雇員(don funk,雇員id為2)及其所有各級(直接或間接)下屬的資訊:
1with empscte as2(
3select
empid, mgrid, firstname, lastname
4from
hr.employees
5where empid =26
7union
all8
9select
c.empid, c.mgrid, c.firstname, c.lastname
10from empscte asp11
join hr.employees asc12
on c.mgrid =
p.empid13)
14select
empid, mgrid, firstname, lastname
15from empscte;
為了安全起見,sql server預設把遞迴成員最多可以呼叫的次數限制為100次,當遞迴成員的呼叫次數超過這個值時,**將會因遞迴失敗而終止執行。如要修改預設最大遞迴次數,可以在外部查詢的最後指定option(maxrecursion n)提示(hint),這裡的n的範圍是0到32767之間的整數。如果想要去掉此限制,可將maxrecursion設為0。
公用表表示式CTE
公用表表示式cte表面上和派生表非常相似,看起來只是語義上的區別。但和派生表比較起來,cte具有幾個優勢 第一,如果須要在乙個cte中引用另乙個cte,不需要像派生表那樣巢狀,相反,只要簡單地在同乙個with子句中定義多個cte,並用逗號把它們分隔開。每個cte可以引用在它前面定義的所有cte。而外...
公用表表示式 CTE
在編寫t sql 時,往往需要臨時儲存某些結果集。前面我們已經廣泛使用和介紹了兩種臨時儲存結果集的方法 臨時表和表變數。除此之外,還可以使用公用表表示式的方法。公用表表示式 common table expression 是sql server2005版本的引入的乙個特性。cte可以看組是乙個臨時的...
公用表表示式 CTE
在編寫t sql 時,往往需要臨時儲存某些結果集。前面我們已經廣泛使用和介紹了兩種臨時儲存結果集的方法 臨時表和表變數。除此之外,還可以使用公用表表示式的方法。公用表表示式 common table expression 是sql server2005版本的引入的乙個特性。cte可以看組是乙個臨時的...