一、由父節點遞歸查詢所有子孫節點
WITH cte (id, parentid, text) AS (
-- Anchor: 根節點
SELECT id, parentid, text FROM treeview WHERE parentid = 450
UNION ALL
-- Recursive: 往下查找子節點
SELECT t.id, t.parentid, t.text
FROM treeview AS t
INNER JOIN cte AS c ON t.parentid = c.id
)
SELECT id, parentid, text FROM cte;
二、由子節點遞歸查詢所有祖先節點
WITH cte (id, parentid, text) AS (
-- Anchor: 起始子節點
SELECT id, parentid, text FROM treeview WHERE id = 450
UNION ALL
-- Recursive: 往上查找父節點
SELECT t.id, t.parentid, t.text
FROM treeview AS t
INNER JOIN cte AS c ON t.id = c.parentid
)
SELECT id, parentid, text FROM cte;
關鍵差異
| 方向 | Anchor 條件 | JOIN 條件 |
| 父 → 子 | WHERE parentid = @RootId | ON t.parentid = c.id |
| 子 → 父 | WHERE id = @ChildId | ON t.id = c.parentid |
注意事項
- 預設最大遞歸層數 100,可用
OPTION (MAXRECURSION 0) 移除限制 (慎用防無限迴圈)。
- 需確保資料無循環參考,否則會陷入無限遞歸。
- 大量資料建議加入索引
INDEX (parentid) / INDEX (id) 提升 JOIN 效能。