powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / иерархия с повторяющимися парами
8 сообщений из 8, страница 1 из 1
иерархия с повторяющимися парами
    #39591891
Добрый день!
Имеется иерархия, в которой пары child и parent могут несколько раз повторяться, т.к. про пару может быть несколько заказов (No_sakaza).
Как мне для всех элементов элемента найти sys_connect_by_path и CONNECT_BY_ISLEAF?
Вообщем нужно получить такой результат:
Код: 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.
SET LINESIZE 300
with tab#
as
(
select 1 ids, 1 kind, NULL papa, 1 No_sakaza, 50 rub from dual 
UNION ALL
select 2 ids, 2 kind, 1 papa, 1 No_sakaza, 28 rub from dual
UNION ALL
select 3 ids, 3 kind, 2 papa, 1 No_sakaza, 11 rub from dual 
UNION  ALL
select 4 ids, 4 kind, 3 papa, 1 No_sakaza, 22 rub from dual 
UNION ALL
select 5 ids, 1 kind, NULL papa, 2 No_sakaza, 12 rub from dual 
UNION ALL
select 6 ids, 2 kind, 1 papa, 2 No_sakaza, 1 rub from dual
UNION ALL
select 7 ids, 3 kind, 2 papa, 2 No_sakaza, 50 rub from dual 
UNION  ALL
select 8 ids, 4 kind, 3 papa, 2 No_sakaza, 23 rub from dual
UNION  ALL
select 9 ids, 4 kind, 3 papa, 2 No_sakaza, 11 rub from dual 
UNION ALL
select 10 ids, 3 kind, 1 papa, 5 No_sakaza, 23 rub from dual 
)
select distinct ids, kind, papa,No_sakaza, rub, cast(sys_connect_by_path( kind,'/') as varchar2(30)) as path, CONNECT_BY_ISLEAF as isleaf, level from tab#
start with papa is null
connect by nocycle prior  kind = papa
order by 1;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
       IDS       KIND       PAPA  NO_SAKAZA        RUB PATH                               ISLEAF      LEVEL
---------- ---------- ---------- ---------- ---------- ------------------------------ ---------- ----------
         1          1                     1         50 /1                                      0          1
         2          2          1          1         28 /1/2                                    0          2
         3          3          2          1         11 /1/2/3                                  0          3
         4          4          3          1         22 /1/2/3/4                                1          4
         4          4          3          1         22 /1/3/4                                  1          3
         5          1                     2         12 /1                                      0          1
         6          2          1          2          1 /1/2                                    0          2
         7          3          2          2         50 /1/2/3                                  0          3
         8          4          3          2         23 /1/2/3/4                                1          4
         8          4          3          2         23 /1/3/4                                  1          3
         9          4          3          2         11 /1/2/3/4                                1          4
         9          4          3          2         11 /1/3/4                                  1          3
        10          3          1          5         23 /1/3                                    0          2

13 rows selected.

Проблема в том, что если таблица имеет 30.000 строк и про пару (child и parent) несколько заказов (NO_SAKAZA ), то иерархический запрос, конечно же, не может выполниться ( ORA-1652 ).
Можете подсказать, как можно с помощью SQL получить значения sys_connect_by_path и CONNECT_BY_ISLEAF для большой таблицы с повторяющимися данными?


Спасибо
Oracle 12.1.0.2.0
...
Рейтинг: 0 / 0
иерархия с повторяющимися парами
    #39592005
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hans Christian Andersen,

Hans Christian Andersen про пару (child и parent) несколько заказов (NO_SAKAZA ) внятно объясни.

ни черта не понятно... ты это хочешь?
Код: 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.
with tab#
as
(
select 1 ids, 1 kind, NULL papa, 1 No_sakaza, 50 rub from dual 
UNION ALL
select 2 ids, 2 kind, 1 papa, 1 No_sakaza, 28 rub from dual
UNION ALL
select 3 ids, 3 kind, 2 papa, 1 No_sakaza, 11 rub from dual 
UNION  ALL
select 4 ids, 4 kind, 3 papa, 1 No_sakaza, 22 rub from dual 
UNION ALL
select 5 ids, 1 kind, NULL papa, 2 No_sakaza, 12 rub from dual 
UNION ALL
select 6 ids, 2 kind, 1 papa, 2 No_sakaza, 1 rub from dual
UNION ALL
select 7 ids, 3 kind, 2 papa, 2 No_sakaza, 50 rub from dual 
UNION  ALL
select 8 ids, 4 kind, 3 papa, 2 No_sakaza, 23 rub from dual
UNION  ALL
select 9 ids, 4 kind, 3 papa, 2 No_sakaza, 11 rub from dual 
UNION ALL
select 10 ids, 3 kind, 1 papa, 5 No_sakaza, 23 rub from dual 
)
select --distinct 
   ids, kind, papa,No_sakaza, rub, cast(sys_connect_by_path( kind,'/') as varchar2(30)) as path, CONNECT_BY_ISLEAF as isleaf, level from tab#
start with papa is null
connect by nocycle prior  kind = papa and prior No_sakaza=No_sakaza
order by 1;

...
Рейтинг: 0 / 0
иерархия с повторяющимися парами
    #39592038
xtender,

Вот этот запрос работает медленно или вообще выдает ошибку ORA-1652.
Код: plsql
1.
2.
3.
4.
select distinct ids, kind, papa,No_sakaza, rub, cast(sys_connect_by_path( kind,'/') as varchar2(30)) as path, CONNECT_BY_ISLEAF as isleaf, level from tab#
start with papa is null
connect by nocycle prior  kind = papa
order by 1;


Проблема в повторяющихся элементах по kind и papa.
Например:
select 3 kind, 2 papa, 1 No_sakaza, 11 rub from dual
 union all
select 3 kind, 2 papa, 2 No_sakaza, 50 rub from dual

Может можно как-нибудь переформулировать запрос, что бы работал быстрее?
Нужно для каждой строки получить дерево sys_connect_by_path (1/2/3) и CONNECT_BY_ISLEAF (0 или 1).
...
Рейтинг: 0 / 0
иерархия с повторяющимися парами
    #39593000
xtender,

это выражение не подходит, т.к. номера заказа в иерархии могут быть у каждого элемента разные.
and prior No_sakaza=No_sakaza
...
Рейтинг: 0 / 0
иерархия с повторяющимися парами
    #39593132
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hans Christian Andersen
Код: 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.
SET LINESIZE 300
with tab#
as
(
select 1 ids, 1 kind, NULL papa, 1 No_sakaza, 50 rub from dual 
UNION ALL
select 2 ids, 2 kind, 1 papa, 1 No_sakaza, 28 rub from dual
UNION ALL
select 3 ids, 3 kind, 2 papa, 1 No_sakaza, 11 rub from dual 
UNION  ALL
select 4 ids, 4 kind, 3 papa, 1 No_sakaza, 22 rub from dual 
UNION ALL
select 5 ids, 1 kind, NULL papa, 2 No_sakaza, 12 rub from dual 
UNION ALL
select 6 ids, 2 kind, 1 papa, 2 No_sakaza, 1 rub from dual
UNION ALL
select 7 ids, 3 kind, 2 papa, 2 No_sakaza, 50 rub from dual 
UNION  ALL
select 8 ids, 4 kind, 3 papa, 2 No_sakaza, 23 rub from dual
UNION  ALL
select 9 ids, 4 kind, 3 papa, 2 No_sakaza, 11 rub from dual 
UNION ALL
select 10 ids, 3 kind, 1 papa, 5 No_sakaza, 23 rub from dual 
),
tree as (select distinct kind, papa from tab#)
select distinct t.ids, t.kind, t.papa,t.No_sakaza, t.rub, cast(sys_connect_by_path( tr.kind,'/') as varchar2(30)) as path, CONNECT_BY_ISLEAF as isleaf, level from tab# t join tree tr on t.kind = tr.kind
start with papa is null
connect by nocycle prior  tr.kind = tr.papa
order by 1;

?
...
Рейтинг: 0 / 0
иерархия с повторяющимися парами
    #39593322
Павел Воронцов,

спасибо. Буду тестировать.
...
Рейтинг: 0 / 0
иерархия с повторяющимися парами
    #39593333
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hans Christian Andersen,

Не очень понял условие, но подгонял под ответ =)

Код: 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.
33.
with tab#
as
(
select 1 ids, 1 kind, NULL papa, 1 No_sakaza, 50 rub from dual 
UNION ALL
select 2 ids, 2 kind, 1 papa, 1 No_sakaza, 28 rub from dual
UNION ALL
select 3 ids, 3 kind, 2 papa, 1 No_sakaza, 11 rub from dual 
UNION  ALL
select 4 ids, 4 kind, 3 papa, 1 No_sakaza, 22 rub from dual 
UNION ALL
select 5 ids, 1 kind, NULL papa, 2 No_sakaza, 12 rub from dual 
UNION ALL
select 6 ids, 2 kind, 1 papa, 2 No_sakaza, 1 rub from dual
UNION ALL
select 7 ids, 3 kind, 2 papa, 2 No_sakaza, 50 rub from dual 
UNION  ALL
select 8 ids, 4 kind, 3 papa, 2 No_sakaza, 23 rub from dual
UNION  ALL
select 9 ids, 4 kind, 3 papa, 2 No_sakaza, 11 rub from dual 
UNION ALL
select 10 ids, 3 kind, 1 papa, 5 No_sakaza, 23 rub from dual 
),
con as (select kind, nvl(papa,-1) papa_N ,cast(sys_connect_by_path( kind,'/') as varchar2(30)) as path, CONNECT_BY_ISLEAF as isleaf, level lvl
           from (select distinct kind, papa from tab# )
          start with papa is null
          connect by nocycle prior kind = papa
          )
select t.ids, t.kind, t.papa, t.No_sakaza, t.rub, path, isleaf, lvl
from tab# t, con cn
where t.kind = cn.kind and (nvl(t.papa,-1) = cn.papa_N)

order by 1;
...
Рейтинг: 0 / 0
иерархия с повторяющимися парами
    #39593387
MaximaXXL,

похоже, что правильно понял.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / иерархия с повторяющимися парами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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