Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / иерархия с повторяющимися парами / 8 сообщений из 8, страница 1 из 1
26.01.2018, 18:58
    #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
26.01.2018, 23:44
    #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
27.01.2018, 01:28
    #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
29.01.2018, 21:22
    #39593000
иерархия с повторяющимися парами
xtender,

это выражение не подходит, т.к. номера заказа в иерархии могут быть у каждого элемента разные.
and prior No_sakaza=No_sakaza
...
Рейтинг: 0 / 0
30.01.2018, 10:10
    #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
30.01.2018, 13:48
    #39593322
иерархия с повторяющимися парами
Павел Воронцов,

спасибо. Буду тестировать.
...
Рейтинг: 0 / 0
30.01.2018, 14:01
    #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
30.01.2018, 14:57
    #39593387
иерархия с повторяющимися парами
MaximaXXL,

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


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