我有以下表格:
| ID | TYPE | NAME | PREV_ID |
===============================
| 1 | E | X1 | 1 |
-------------------------------
| 2 | M | X2 | 1 |
-------------------------------
| 3 | M | X2 | 2 |
-------------------------------
| 4 | G | X3 | 3 |
-------------------------------
所以Prev_Id引用了同一个表的Id。从ID 4开始,我需要完整的“路径”到ID 1.在起始“E”和最后的“C”之间可能有几个类型为“m”的条目,因此列表可能更长甚至更短。 是否可以通过一个查询获得完整的连接项链?
答案 0 :(得分:2)
这是典型的分层查询,您唯一需要注意的是,id
= 1 prev_id
也是1,导致无限循环和错误ORA-01436
的原因是什么,所以你有在CTE版本的nocycle
查询或条件中添加connect by
。
解决方案1:
select t.*, connect_by_root(id)||sys_connect_by_path(prev_id, '=>') path
from t
connect by nocycle id = prior prev_id
start with id = 4
解决方案2(Oracle 11g或更高版本):
with cte(id, type, name, prev_id, path) as (
select t.*, id||'=>'||prev_id from t where id = 4
union all
select t.id, t.type, t.name, t.prev_id, cte.path||'=>'||t.prev_id
from t join cte on t.id = cte.prev_id
where t.id <> t.prev_id )
select * from cte
两个查询的输出和demo:
ID TYPE NAME PREV_ID PATH
------ ---- ---- ---------- ---------------
4 G X3 3 4=>3
3 M X2 2 4=>3=>2
2 M X2 1 4=>3=>2=>1