Имеет ли это какой-то смысл?
SQL> with test (child_id, parent_id) as
2 (select 'x', 'd' from dual union all
3 select 'd', 'c' from dual union all
4 select 'c', 'b' from dual union all
5 select 'b', 'a' from dual union all
6 select 'a', null from dual union all
7 --
8 select 'y', 'i' from dual union all
9 select 'i', 'h' from dual union all
10 select 'h', 'g' from dual union all
11 select 'g', 'f' from dual union all
12 select 'f', null from dual
13 ),
14 anc as
15 (select sys_connect_by_path(child_Id, '>') pth
16 from test
17 where connect_by_isleaf = 1
18 connect by prior child_id = parent_id
19 start with parent_id is null
20 )
21 select regexp_substr(pth, '[^>]+', 1, 5) c1,
22 regexp_substr(pth, '[^>]+', 1, 4) c2,
23 regexp_substr(pth, '[^>]+', 1, 3) c3,
24 regexp_substr(pth, '[^>]+', 1, 2) c4,
25 regexp_substr(pth, '[^>]+', 1, 1) c5
26 from anc;
C1 C2 C3 C4 C5
-- -- -- -- --
x d c b a
y i h g f
SQL>
Что это делает?
test
CTE моделирует ваши данные (по крайней мере, я так думаю)
anc
(estors) CTE выбирает «самый длинный» путь, потому что CONNECT_BY_ISLEAF
показывает, может ли текущая строка быть (или не может) расширяться дальше. Если он возвращает 1
, он не может.
- запрос final использует регулярные выражения для преобразования строки CSV (в моем примере это разделитель
>
; может быть что-то еще) в столбцы. В этом нет ничего динамического, поэтому - если ваши данные отличаются от 5 «столбцов», вам придется это исправить