使用Oracle遍历树。每个节点都有一个属性

时间:2018-03-26 19:38:13

标签: oracle oracle11g hierarchy

我在表中有一个简单的层次结构(使用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.

请提供一些有关如何完成此操作的建议(代码需要针对时间进行优化)。

1 个答案:

答案 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