Пройдите дерево с Оракулом. Каждый узел имеет свойство

У меня есть простая иерархическая структура в таблице (с использованием 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 ответ

Там, вероятно, более причудливый способ, чем с помощью 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>%';

Изменить: http://sqlfiddle.com/

Другие вопросы по тегам