[Oracle]遞迴抓資料Recursively select
2009-11-27 |
假設有這麼一個Table:
| ID | NAME | PARENT_ID |
| 1 | 行政院 | 0 |
| 2 | 交通部 | 1 |
| 3 | 教育部 | 1 |
| 4 | 中等教育司 | 3 |
| 5 | 高等教育司 | 3 |
| 6 | 一科 | 5 |
1. 給定(3, 教育部)後,要怎麼知道:
教育部/中等教育司
教育部/高等教育司/一科
這些路徑呢?
2. 給定(6, 一科, 5)之後,要怎麼知道最上層是行政院呢?
(也就是 一科/高等教育司/教育部/行政院 這條路徑)
如果用程式去跑迴圈,並不是最聰明的解法;以下是使用CONNECT BY的SQL語法。
針對第一個問題,可以這麼寫:
SELECT LEVEL, id, name, parent_id, SYS_CONNECT_BY_PATH(name, '/')
FROM t
START WITH ID = 3
CONNECT BY PRIOR id = parent_id
而第二個問題,只要反著寫即可:
SELECT LEVEL, id, name, parent_id, SYS_CONNECT_BY_PATH(name, '/')
FROM t
START WITH ID = 6
CONNECT BY PRIOR parent_id = id