表 `TRANS_INST` 存儲樹狀結構:
需求:給定任一節點 (如 `480242`),找出該節點為根的子樹中所有葉子節點。
SELECT trans_id FROM trans_inst WHERE CONNECT_BY_ISLEAF = 1 START WITH trans_id = 480242 CONNECT BY PRIOR up_trans_id = trans_id;
| 子句 | 作用 |
|---|---|
START WITH trans_id = 480242 | 指定遞歸起點 (根節點) |
CONNECT BY PRIOR up_trans_id = trans_id | 定義父子關係:當前行的 `up_trans_id` = 父行的 `trans_id` (反向遍歷) |
CONNECT_BY_ISLEAF | 偽欄位:1=葉子節點 (無子節點),0=非葉子 |
WHERE CONNECT_BY_ISLEAF = 1 | 過濾僅保留葉子節點 |
| 方向 | START WITH | CONNECT BY PRIOR | 用途 |
|---|---|---|---|
| 自頂向下 (根→葉) | 根節點 ID | `PRIOR trans_id = up_trans_id` | 展開子樹、層級報表 |
| 自底向上 (葉→根) | 葉/任意節點 ID | `PRIOR up_trans_id = trans_id` | 尋找祖先鏈、根因分析 |
SELECT trans_id,
SYS_CONNECT_BY_PATH(trans_id, ' → ') AS path_from_root
FROM trans_inst
WHERE CONNECT_BY_ISLEAF = 1
START WITH trans_id = 480242
CONNECT BY PRIOR up_trans_id = trans_id;
SELECT trans_id FROM trans_inst WHERE CONNECT_BY_ISLEAF = 1 AND LEVEL <= 5 -- 最多 5 層 START WITH trans_id = 480242 CONNECT BY PRIOR up_trans_id = trans_id;
SELECT trans_id FROM trans_inst WHERE CONNECT_BY_ISLEAF = 1 START WITH trans_id = 480242 CONNECT BY NOCYCLE PRIOR up_trans_id = trans_id; -- 若資料有環,NOCYCLE 避免無限循環,並可用 CONNECT_BY_ISCYCLE 檢測
WITH RECURSIVE tree AS ( SELECT trans_id, up_trans_id, 1 AS lvl FROM trans_inst WHERE trans_id = 480242 UNION ALL SELECT t.trans_id, t.up_trans_id, tree.lvl + 1 FROM trans_inst t JOIN tree ON t.up_trans_id = tree.trans_id WHERE tree.lvl < 100 -- 防無限遞歸 ) SELECT trans_id FROM tree WHERE trans_id NOT IN (SELECT up_trans_id FROM trans_inst); -- 葉子節點