powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Маршрут иерархии
9 сообщений из 9, страница 1 из 1
Маршрут иерархии
    #39361882
У меня есть ерархия подчинения. Причем один подчиненный может иметь несколько parent и несколько child. Мне нужно вывести для каждого child маршрут до всех его parent.

Код: 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.
26.
27.
28.
29.
30.
31.
32.
drop table y;
create table y(c varchar(1),p varchar2(1));
 
insert into y values('B','A');
insert into y values('C','A');
insert into y values('C','B');
insert into y values('D','C');
commit;
 
select * from y order by c,p;
 
 
 
--желаемый результат:
B => A
 
C => A
C => B
C => B => A
 
D => C
D => C => B
D => C => A
D => C => B =>A
 
 
-- это не то:
select c,listagg(p,' => ') WITHIN GROUP (order by level desc) route
from y
connect by prior c=p
group by c
order by c
...
Рейтинг: 0 / 0
Маршрут иерархии
    #39361886
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дональд_Трамп-- это не то:
Код: plsql
1.
listagg

RTFM sys_connect_by_path
...
Рейтинг: 0 / 0
Маршрут иерархии
    #39361938
Elic, это то что нужно.

Единственное, мне не понятно почему путь не полный(нет самого первого) а в качествн чайлда появляется не самый нижний, а предпоследний сверху. Как показать полный путь?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT c,SYS_CONNECT_BY_PATH(p, ' => ')path,level
FROM y
CONNECT BY PRIOR p=c
order by 1,level;
 
 
C    PATH               LEVEL
B     => A                  1
B     => B => A         2
B     => C => B => A    3
C     => B                  1
C     => A              1
C     => C => A         2
C     => C => B         2
D     => C                1
 
...
Рейтинг: 0 / 0
Маршрут иерархии
    #39361954
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дональд_Трамп,

добавить connect_by_root
...
Рейтинг: 0 / 0
Маршрут иерархии
    #39361979
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дональд_ТрампЕдинственное, мне не понятно почему путь не полный(нет самого первого) а в качествн чайлда появляется не самый нижний, а предпоследний сверху.Потому что у тебя не иерархия сущностей, а связи между ними.
...
Рейтинг: 0 / 0
Маршрут иерархии
    #39362489
Сергей Арсеньев, добавил каннект бай рут и все показало как надо. Спасибо!

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with y as (
    select 'B' c,'A'p, 1 v from dual union all
    select 'C' c,'A' p, 2 v from dual union all
    select 'C' c,'B' p, 10 v from dual union all
    select 'D' c,'C' p, 4 v from dual --union all
)
SELECT connect_by_root c c,SYS_CONNECT_BY_PATH(p, ' => ')path,level
FROM y
CONNECT BY PRIOR p=c
order by 1,level;

 



Теперь у меня вопрос как показать маршруты которые проходят по связем у которые v>=10 (связь C-B). Конечно можно отфильтровать в конце
Код: plsql
1.
  where instr(path,'C=>B')>0 



Но сэ не есть гуд. Есть ли что-то встроенное?
...
Рейтинг: 0 / 0
Маршрут иерархии
    #39362504
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дональд_ТрампЕсть ли что-то встроенное?Внутри черепной коробки.
...
Рейтинг: 0 / 0
Маршрут иерархии
    #39362558
ElicДональд_ТрампЕсть ли что-то встроенное?Внутри черепной коробки.

Если я соглашусь, что моя коробка сильно меньше, чем у местных экспертов. Можно мне показать куда копать?
...
Рейтинг: 0 / 0
Маршрут иерархии
    #39362576
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
trim(sys_connect_by_path(case when <something> then 'Y' end, ' ')) as has_somthing
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Маршрут иерархии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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