CREATE TABLE TBL_TEST (
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);
INSERT INTO TBL_TEST (ID, NAME, PID) VALUES (1, '10', 0);
INSERT INTO TBL_TEST (ID, NAME, PID) VALUES (2, '11', 1);
INSERT INTO TBL_TEST (ID, NAME, PID) VALUES (3, '20', 0);
INSERT INTO TBL_TEST (ID, NAME, PID) VALUES (4, '12', 1);
INSERT INTO TBL_TEST (ID, NAME, PID) VALUES (5, '121', 2);
COMMIT;
資料結構呈現樹狀階層:
SELECT *
FROM TBL_TEST
START WITH id = 1
CONNECT BY PRIOR id = pid;
結果:依序回傳 1 → 2 → 5 → 4(深度優先走訪)。
SELECT *
FROM TBL_TEST
START WITH id = 5
CONNECT BY PRIOR pid = id;
結果:依序回傳 5 → 2 → 1。
| 子句 | 說明 |
|---|---|
START WITH | 指定遞歸起始點(根節點或葉節點) |
CONNECT BY | 定義父子關聯條件,PRIOR 修飾父層欄位 |
PRIOR id = pid | 父層 ID = 子層 PID(向下遞歸) |
PRIOR pid = id | 父層 PID = 子層 ID(向上遞歸) |
SELECT LPAD(' ', 2*(LEVEL-1)) || NAME AS TREE_VIEW, LEVEL
FROM TBL_TEST
START WITH id = 1
CONNECT BY PRIOR id = pid;
SELECT *
FROM TBL_TEST
START WITH id = 1
CONNECT BY NOCYCLE PRIOR id = pid;
加入 NOCYCLE 可防止資料異常導致無限迴圈,並可搭配 CONNECT_BY_ISCYCLE 偵測循環。
SELECT SYS_CONNECT_BY_PATH(NAME, ' > ') AS PATH
FROM TBL_TEST
START WITH id = 1
CONNECT BY PRIOR id = pid;