WITH CTE_Name (Col1, Col2, ...) AS ( -- 定點成員 SELECT Col1, Col2, ... FROM BaseTable WHERE RootCondition UNION ALL -- 遞歸成員 SELECT T.Col1, T.Col2, ... FROM BaseTable T JOIN CTE_Name C ON C.Col1 = T.ParentCol ) SELECT * FROM CTE_Name;
MAXRECURSION 上限 (預設 100,0=無限制)。USE AdventureWorks; GO WITH OrgCTE (EmployeeID, ManagerID, Title, Level) AS ( -- 定點:頂層管理者 (無上級) SELECT EmployeeID, ManagerID, Title, 0 AS Level FROM HumanResources.Employee WHERE ManagerID IS NULL UNION ALL -- 遞歸:尋找下屬 SELECT E.EmployeeID, E.ManagerID, E.Title, C.Level + 1 FROM HumanResources.Employee E JOIN OrgCTE C ON C.EmployeeID = E.ManagerID ) SELECT EmployeeID, ManagerID, Title, Level FROM OrgCTE OPTION (MAXRECURSION 0); -- 移除 100 層限制
-- 限制最多 50 層 SELECT * FROM OrgCTE OPTION (MAXRECURSION 50); -- 偵測循環 (圖結構) 需自行加欄位追蹤路徑 WITH GraphCTE (NodeId, Path, Depth) AS ( SELECT NodeId, CAST(NodeId AS VARCHAR(MAX)), 0 FROM Graph WHERE IsRoot = 1 UNION ALL SELECT G.NodeId, C.Path + '->' + CAST(G.NodeId AS VARCHAR(MAX)), C.Depth + 1 FROM Graph G JOIN GraphCTE C ON C.NodeId = G.ParentId WHERE C.Path NOT LIKE '%' + CAST(G.NodeId AS VARCHAR(10)) + '%' -- 簡易循環檢測 ) SELECT * FROM GraphCTE OPTION (MAXRECURSION 0);
ManagerID, ParentId) 必須有索引。WHILE + #Tmp 迭代。遞歸 CTE 是 SQL Server 處理層次/圖結構的標準工具,語法簡潔、符合 ANSI SQL。善用 MAXRECURSION 控制深度、索引加速 JOIN、窄欄位減輕資源,即能高效解決樹狀/圖狀查詢需求。