WITH (遞迴)
遞迴 CTE 結構至少必須包含一個錨點成員與一個遞迴成員。下列虛擬程式碼顯示含有單一錨點成員與單一遞迴成員的簡單遞迴 CTE 所具備的元件。
WITH cte_name ( column_name [,...n] )
AS
(
CTE_query_definition –- Anchor member is defined.
UNION ALL
CTE_query_definition –- Recursive member is defined referencing cte_name.
)
SELECT * FROM cte_name
CTE 中不可以使用以下的子句:
1.COMPUTE 或 COMPUTE BY
2.ORDER BY (除非指定了 TOP 子句)
3.INTO
4.含有查詢提示的 OPTION 子句
5.FOR XML
6.FOR BROWSE
範例1:
資料清單
--如果CTE的WITH不在第一列, 前方要加上;
;WITH 公司組織結果(部門名稱, 直屬部門, 層級, 排序欄位)
AS
(
--Recursive CTE分為兩個部分, 第一部分為Anchor Member,指不會被遞迴呼叫到的部分
SELECT
部門名稱,
直屬部門,
0,
CONVERT(nvarchar(128), 部門ID)
FROM dbo.公司組織
WHERE 直屬部門=N'ROOT'
UNION ALL
--UNION ALL後方的部分稱為Recursive Member, 會在遞迴過程中反覆執行,直到無任何查詢結果為止
SELECT
P.部門名稱,
P.直屬部門,
B.層級+1,
CONVERT(nvarchar(128), B.排序欄位 + '-' + CONVERT(nvarchar(128), P.部門ID))
FROM dbo.公司組織 P, 公司組織結果 B
WHERE P.直屬部門=B.部門名稱
)
SELECT (REPLICATE(' ', 層級) + 部門名稱) as '部門名稱', 層級, 排序欄位
FROM 公司組織結果
ORDER BY 排序欄位
範例2:
with myview (sys_dep_up,sys_dep_id )
as
(
select
sys_dep_up,
sys_dep_id
from dbo.sys_dep
where sys_dep_up = 301
union all
select
a.sys_dep_up,
a.sys_dep_id
from dbo.sys_dep a,myview b
where a.sys_dep_up=b.sys_dep_id
)
select sys_dep_id as alldepid
from myview