我有一个包含这些行的表:
ID Parent_ID Name
1 (null) A
2 1 B
3 1 C
4 2 D
5 3 E
6 5 F
7 (null) G
8 (null) H
无论Name ='A'还是'F'作为条件传递,我都需要获取所有相关行的ID。在这种情况下,我应该在7和8旁边收到所有ID。
我尝试了很多例子并阅读了很多文章,但我现在放弃了。你能帮忙吗?
答案 0 :(得分:0)
A
位于层次结构的根目录(它是B
的父级,它是D
的父级,等等。从A
开始,一直向下F
(以及D
和E
,其中A
作为父母通过不同的路线):
SELECT ID, Parent_ID, Name
FROM tbl
START WITH Name = 'A'
CONNECT BY PRIOR ID = Parent_ID
F
位于层次结构的末尾。 Oracle称之为“叶子”。从叶F
开始,最后到达A
:
SELECT ID, Parent_ID, Name
FROM tbl
START WITH Name = 'F' -- start with F instead of A
CONNECT BY PRIOR Parent_ID = ID -- switch the CONNECT BY to work up
Oracle具有SYS_CONNECT_BY_PATH
功能,非常适合可视化层次结构。以下是在第一个查询中使用它的方法(A
下至F
):
SELECT ID, Parent_ID, Name, SYS_CONNECT_BY_PATH(Name, '/') AS Path
FROM tbl
START WITH Name = 'A'
CONNECT BY PRIOR ID = Parent_ID
结果:
ID PARENT_ID NAME PATH
---- ---------- ---- -----------
1 A /A
2 1 B /A/B
4 2 D /A/B/D
3 1 C /A/C
5 3 E /A/C/E
6 5 F /A/C/E/F
您可以使用任何您想要的分隔符作为SYS_CONNECT_BY_PATH
的第二个参数。
答案 1 :(得分:0)
with
t as (
select id
from your_table
where name = 'D' -- your starting point
)
select id
from (
select id, parent_id from your_table
where parent_id is not null
union all
select parent_id, id from your_table
where parent_id is not null
union all
select id, null from t
)
start with parent_id is null
connect by nocycle prior id = parent_id