遞迴CTE是SQL SERVER 2005中重要的增強之一。一般我們在處理樹,圖和階層的問題時需要用到遞迴查詢。
CTE的文法如下
1 WITH CTE AS
2 (
3 SELECT EmpId, ReportTo, FName FROM Employ WHERE EmpId=1
4 UNION ALL
5 SELECT emp.EmpId, emp.ReportTo, emp.FName FROM CTE JOIN Employ as emp ON CTE.EmpId=emp.ReportTo
6 )
遞迴CTE最少包含兩個查詢(也被稱為成員)。第一個查詢為定點成員,定點成員只是一個返回有效表的查詢,用於遞迴的基礎或錨點。第二個查詢被稱為遞迴成員,使該查詢稱為遞迴成員的是對CTE名稱的遞迴引用是觸發。在邏輯上可以將CTE名稱的內部應用理解為前一個查詢的結果集。
遞迴查詢沒有顯式的遞迴終止條件,只有當第二個遞迴查詢返回空結果集或是超出了遞迴次數的最大限制時才停止遞迴。是指遞迴次數上限的方法是使用MAXRECURION。
1 USE AdventureWorks;
2 GO
3 --Creates an infinite loop
4 WITH cte (EmployeeID, ManagerID, Title) as
5 (
6 SELECT EmployeeID, ManagerID, Title
7 FROM HumanResources.Employee
8 WHERE ManagerID IS NOT NULL
9 UNION ALL
10 SELECT cte.EmployeeID, cte.ManagerID, cte.Title
11 FROM cte
12 JOIN HumanResources.Employee AS e
13 ON cte.ManagerID = e.EmployeeID
14 )
15 --Uses MAXRECURSION to limit the recursive levels to 2
16 SELECT EmployeeID, ManagerID, Title
17 FROM cte
18 OPTION (MAXRECURSION 2);
19 GO