Пройдите дерево с Оракулом. Каждый узел имеет свойство
У меня есть простая иерархическая структура в таблице (с использованием 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/