首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server 2005/2008 遞迴 CTE 查詢樹狀結構完整範例

     編輯:SQL Server 2005

測試資料:家族關係表

DECLARE @TT TABLE (Id INT, Relation VARCHAR(25), Name VARCHAR(25), ParentId INT);
INSERT @TT VALUES
(1, 'Great GrandFather', 'Thomas Bishop', NULL),
(2, 'Grand Mom', 'Elian Thomas Wilson', 1),
(3, 'Dad', 'James Wilson', 2),
(4, 'Uncle', 'Michael Wilson', 2),
(5, 'Aunt', 'Nancy Manor', 2),
(6, 'Grand Uncle', 'Michael Bishop', 1),
(7, 'Brother', 'David James Wilson', 3),
(8, 'Sister', 'Michelle Clark', 3),
(9, 'Brother', 'Robert James Wilson', 3),
(10, 'Me', 'Steve James Wilson', 3);

遞迴 CTE 查詢

;WITH FamilyTree AS (
    -- Anchor: 根節點
    SELECT *, CAST(NULL AS VARCHAR(25)) AS ParentName, 0 AS Generation
    FROM @TT WHERE ParentId IS NULL
    UNION ALL
    -- Recursive: 子節點
    SELECT f.*, ft.Name AS ParentName, ft.Generation + 1
    FROM @TT f INNER JOIN FamilyTree ft ON f.ParentId = ft.Id
)
SELECT * FROM FamilyTree;

輸出欄位說明

欄位意義
Id節點唯一識別
Relation稱謂
Name姓名
ParentId父節點 Id
ParentName父節點姓名 (CTE 產生)
Generation代數 (根為 0)

應用場景

  • 組織架構 (員工-主管)。
  • 產品分類無限層級。
  • BOM 物料清單展開。
  • 論壇回覆串聯。

效能提示

  • 確保 ParentId 有索引。
  • 加上 OPTION (MAXRECURSION 1000) 防無限遞迴。
  • 大量資料考慮改用 HierarchyId (SQL 2008+) 或路徑編碼法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved