我在表中有一个简单的层次结构(使用Oracle Database 11g)
A
|-B
|-B1
|-C
|-D
每个节点都有一个与之关联的属性(Y或N)。
从根节点(父节点)遍历,我想获得每个分支中具有属性Y的第一个节点。
例如:
A
|-B (N)
|-B1 (Y)
|--B2 (N)
|-C (Y)
|-C1 (Y)
|--C2 (N)
|-D (Y)
这应该返回B1,C和D.
请提供一些有关如何完成此操作的建议(代码需要针对时间进行优化)。
答案 0 :(得分:0)
可能比使用sys_connect_by_path
更有效,但我发现它很容易理解。
create table hier_test (id varchar2(2), parent_id varchar2(2), prop varchar2(1));
insert into hier_test values ('A', null, 'N');
insert into hier_test values ('B', 'A', 'N');
insert into hier_test values ('C', 'A', 'Y');
insert into hier_test values ('D', 'A', 'Y');
insert into hier_test values ('B1', 'B', 'Y');
insert into hier_test values ('B2', 'B1', 'N');
insert into hier_test values ('C1', 'C', 'Y');
insert into hier_test values ('C2', 'C1', 'N');
select id from (
select id, prop, sys_connect_by_path(prop, '>') as priors
from hier_test
connect by parent_id = prior id
start with id = 'A'
)
where prop = 'Y' and priors not like '%Y>%';
修改:sqlfiddle