SQL Server 2008中的CTE遞歸查詢


遞歸 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

遞歸執行的語義如下:

  1. 將 CTE 表達式拆分爲定位點成員和遞歸成員。

  2. 運行定位點成員,創建第一個調用或基準結果集 (T0)。

  3. 運行遞歸成員,將 Ti 作爲輸入,將 Ti+1 作爲輸出。

  4. 重複步驟 3,直到返回空集。

  5. 返回結果集。這是對 T0 到 Tn 執行 UNION ALL 的結果

例子1:查詢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.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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章