遞歸 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.
)
-- Statement using the CTE
SELECT *
FROM cte_name
遞歸執行的語義如下:
-
將 CTE 表達式拆分爲定位點成員和遞歸成員。
-
運行定位點成員,創建第一個調用或基準結果集 (T0)。
-
運行遞歸成員,將 Ti 作爲輸入,將 Ti+1 作爲輸出。
-
重複步驟 3,直到返回空集。
-
返回結果集。這是對 T0 到 Tn 執行 UNION ALL 的結果
WITH lmenu(deptid,up_dept) as
(
SELECT deptid,up_dept FROM dept WHERE up_dept='CN06000168'
union ALL
SELECT A.deptid,A.up_dept FROM dept A,lmenu b
where a.up_dept = b.deptid
)
SELECT * from lmenu --order by level
option(maxrecursion number)
例子2:查詢CN06000168所有的父部門:
WITH lmenu(deptid,up_dept) as
(
SELECT deptid,up_dept FROM dept WHERE up_dept='CN06000168'
union ALL
SELECT A.deptid,A.up_dept FROM dept A,lmenu b
where a.deptid = b.up_dept
)
SELECT * from lmenu --order by level
<pre name="code" class="sql"> option(maxrecursion number)