Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Маршрут иерархии / 9 сообщений из 9, страница 1 из 1
07.12.2016, 15:12
    #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
07.12.2016, 15:16
    #39361886
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрут иерархии
Дональд_Трамп-- это не то:
Код: plsql
1.
listagg

RTFM sys_connect_by_path
...
Рейтинг: 0 / 0
07.12.2016, 15:57
    #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
07.12.2016, 16:11
    #39361954
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрут иерархии
Дональд_Трамп,

добавить connect_by_root
...
Рейтинг: 0 / 0
07.12.2016, 16:36
    #39361979
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрут иерархии
Дональд_ТрампЕдинственное, мне не понятно почему путь не полный(нет самого первого) а в качествн чайлда появляется не самый нижний, а предпоследний сверху.Потому что у тебя не иерархия сущностей, а связи между ними.
...
Рейтинг: 0 / 0
08.12.2016, 12:55
    #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
08.12.2016, 13:06
    #39362504
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрут иерархии
Дональд_ТрампЕсть ли что-то встроенное?Внутри черепной коробки.
...
Рейтинг: 0 / 0
08.12.2016, 14:16
    #39362558
Маршрут иерархии
ElicДональд_ТрампЕсть ли что-то встроенное?Внутри черепной коробки.

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


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