powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос
5 сообщений из 5, страница 1 из 1
Иерархический запрос
    #39887364
dimyaz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго!

Есть выборка следующего содержания:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t1 as (
    select 'app5' name , 'app4' producer from dual union all
    select 'app4' name , 'app3' producer from dual union all
    select 'app3' name , 'app2' producer from dual union all
    select 'app2' name , 'app1' producer from dual union all
    select 'app5' name , 'app3' producer from dual union all
    select 'app5' name , 'app2' producer from dual union all
    select 'app6' name , 'app1' producer from dual union all
    select 'app6' name , 'app2' producer from dual union all
    select 'app5' name , 'app1' producer from dual
)
select t1.*
from t1



Результат этой выборки показывает зависимости между объектами, где Name это объект, а Producer это родитель.
Нужно вычислить корневые объекты, и вывести все максимальные ветки этих зависимостей от корневых объектов
Так вот, пытаюсь вытащить список всех веток через level и через sys_connect_by_path, но получается полная фигня. Данные сильно размножаются и выходит много лишних веток, так как не могу исключить малые ветки, которые уже входят в другие(Например app1/app5 есть в ветке app1/app2/app3/app4/app5).

По результату ожидается такой вывод:

Ветка Level Name1 1 app11 2 app21 3 app31 4 app41 5 app52 1 app12 2 app22 3 app6

Либо такой
Ветка Path1 app1/app2/app3/app4/app52 app1/app2/app6

Хотя, если получится первый вариант, второй будет построить 5сек.
...
Рейтинг: 0 / 0
Иерархический запрос
    #39887368
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyaz
от корневых объектов
начинай с листовых.
...
Рейтинг: 0 / 0
Иерархический запрос
    #39887375
Фотография Anton_Demin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Иерархический запрос
    #39887381
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyaz,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with t1 as (
    select 'app5' name , 'app4' producer from dual union all
    select 'app4' name , 'app3' producer from dual union all
    select 'app3' name , 'app2' producer from dual union all
    select 'app2' name , 'app1' producer from dual union all
    select 'app5' name , 'app3' producer from dual union all
    select 'app5' name , 'app2' producer from dual union all
    select 'app6' name , 'app1' producer from dual union all
    select 'app6' name , 'app2' producer from dual union all
    select 'app5' name , 'app1' producer from dual
)
, t2 as (select producer from t1 minus select name from t1)
select max(connect_by_root producer||sys_connect_by_path(name,'/')) keep (dense_rank first order by level desc) path
from t1
where connect_by_isleaf =1
connect by prior name = producer 
start with t1.producer in (select producer from t2)
--group by  case when connect_by_isleaf =1 then name end 
group by name --поскольку where connect_by_isleaf =1
...
Рейтинг: 0 / 0
Иерархический запрос
    #39887533
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учитываем multipath-инг
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with t1 as (
    select 'app9' name , 'app4' producer from dual union all
    select 'app5' name , 'app4' producer from dual union all
    select 'app4' name , 'app3' producer from dual union all
    select 'app5' name , 'app8' producer from dual union all
    select 'app8' name , 'app3' producer from dual union all
    select 'app3' name , 'app2' producer from dual union all
    select 'app2' name , 'app1' producer from dual union all
    select 'app3' name , 'app7' producer from dual union all
    select 'app7' name , 'app1' producer from dual union all
    select 'app5' name , 'app3' producer from dual union all
    select 'app5' name , 'app2' producer from dual union all
    select 'app6' name , 'app1' producer from dual union all
    select 'app6' name , 'app2' producer from dual union all
    select 'app5' name , 'app1' producer from dual
)
, t2 as (select producer from t1 minus select name from t1)
, t3 as (select connect_by_root producer||sys_connect_by_path(name,'/') path
              , level as lvl
              , max(level) over (partition by name )  as maxlvl
           from t1
          where connect_by_isleaf =1
        connect by prior name = producer 
          start with t1.producer in (select producer from t2))
select * from t3 where lvl = maxlvl
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]