Sql Server 使用CTE實現遞迴查詢

iSQlServer發表於2010-01-06
 遞迴CTE是SQL SERVER 2005中重要的增強之一。一般我們在處理樹,圖和層次結構的問題時需要用到遞迴查詢。

  CTE的語法如下

 

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt1 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。

 

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt 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

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-624449/,如需轉載,請註明出處,否則將追究法律責任。

相關文章