Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ближайший родитель, потомок корневого родителя / 9 сообщений из 9, страница 1 из 1
25.07.2019, 09:47
    #39841232
rost.slv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
Добрый день.
Есть вот такая таблица

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
create table rost_task3_irhy
(
       id_f number(10) --код
       ,id_par number (10) --код родителя
       ,name_v varchar2(100) --название
       ,full_name varchar(1000) --полное название
)
/
insert all
       into rost_task3_irhy values (1 ,null ,'Департамент розничных технологий', null)
       into rost_task3_irhy values (2 ,null ,'Департамент продаж ГМ', null)
       into rost_task3_irhy values (3 ,null ,'Департамент продаж ММ', null)
       into rost_task3_irhy values (4 ,null ,'Департамент продаж формата Аптеки', null)
       into rost_task3_irhy values (5 ,null ,'Департамент продаж дрогери', null)
       into rost_task3_irhy values (6 ,1 ,'Управление внедрения технологий', null)
       into rost_task3_irhy values (7 ,1 ,'Управление разработки и автоматизации', null)
       into rost_task3_irhy values (8 ,1 ,'Управление бизнес-аналитики', null)
       into rost_task3_irhy values (9 ,6 ,'Руководитель управления внедрения технологий', null)
       into rost_task3_irhy values (10 ,6 ,'Руководитель стратегических проектов', null)
       into rost_task3_irhy values (11 ,6 ,'Руководитель проекта', null)
       into rost_task3_irhy values (12 ,9 ,'Администратор проекта', null)
       into rost_task3_irhy values (13 ,9 ,'Старший менеджер', null)
       into rost_task3_irhy values (14 ,13 ,'Менеджер', null)
       into rost_task3_irhy values (15 ,7 ,'Руководитель управления разработки и автоматизации', null)
       into rost_task3_irhy values (16 ,15 ,'Старший менеджер', null)
       into rost_task3_irhy values (17 ,16 ,'Менеджер', null)
       into rost_task3_irhy values (18 ,8 ,'Руководитель управления бизнес-анализа', null)
       into rost_task3_irhy values (19 ,18 ,'Ведущий аналитик', null)
       into rost_task3_irhy values (20 ,19 ,'Аналитик бизнес-процессов', null)
       into rost_task3_irhy values (21 ,20 ,'Методист', null)
       into rost_task3_irhy values (22 ,2 ,'Сектор экономического анализа СООГМ', null)
       into rost_task3_irhy values (23 ,2 ,'Сектор анализа ассортимента СП ГМ/МС', null)
       into rost_task3_irhy values (24 ,2 ,'Сектор производственного учета', null)
       into rost_task3_irhy values (25 ,22 ,'Руководитель сектора', null)
       into rost_task3_irhy values (26 ,25 ,'Ведущий специалист', null)
       into rost_task3_irhy values (27 ,26 ,'Менеджер', null)
       into rost_task3_irhy values (28 ,27 ,'Специалист', null)
       into rost_task3_irhy values (29 ,24 ,'Старший специалист', null)
       into rost_task3_irhy values (30 ,29 ,'Специалист', null)
       into rost_task3_irhy values (31 ,23 ,'Руководитель сектора', null)
       into rost_task3_irhy values (32 ,31 ,'Аналитик', null)
       into rost_task3_irhy values (33 ,5 ,'Отдел методологии управления продажами', null)
       into rost_task3_irhy values (34 ,5 ,'Отдел по работе с потерями МК', null)
       into rost_task3_irhy values (35 ,34 ,'Начальник отдела', null)
       into rost_task3_irhy values (36 ,35 ,'Ведущий аналитик направления', null)
       into rost_task3_irhy values (37 ,35 ,'Ведущий специалист направления', null)
       into rost_task3_irhy values (38 ,37 ,'Специалист направления', null)
       into rost_task3_irhy values (39 ,36 ,'Аналитик направления', null)
       into rost_task3_irhy values (40 ,33 ,'Начальник отдела методологии управления', null)
       into rost_task3_irhy values (41 ,40 ,'Ведущий специалист', null)
       into rost_task3_irhy values (42 ,41 ,'Специалист направления', null)
select * from dual;
/
begin
  for loop_count in 1 .. 42
  loop
    update rost_task3_irhy
       set full_name =
           (select sys_connect_by_path(name_v, '->') as path
              from rost_task3_irhy
             where id_f = loop_count
             start with id_par is null
            connect by prior id_f = id_par)
     where id_f = loop_count;
  end loop;
end;



Для неё нужно найти все листы, корни этих листов,ближайшего родителя и родителя второго уровня (который после корня)

Не могу понять как найти это "ближайшего родителя и родителя второго уровня (который после корня)"
Пока такие наработки

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select connect_by_root t.id_f as root_id
      ,connect_by_root t.name_v as root_name
      ,t.id_f          as leaf_id
      ,t.name_v        as leaf_name
      ,level           as inc_level
  from rost_task3_irhy t
 where connect_by_isleaf = 1
 start with t.id_par is null
connect by t.id_par = prior t.id_f
...
Рейтинг: 0 / 0
25.07.2019, 10:36
    #39841255
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
with q(id_f,id_par,name_v,full_name) as(
       select 1 ,null ,'Департамент розничных технологий', null from dual union all
       select 2 ,null ,'Департамент продаж ГМ', null from dual union all
       select 3 ,null ,'Департамент продаж ММ', null from dual union all
       select 4 ,null ,'Департамент продаж формата Аптеки', null from dual union all
       select 5 ,null ,'Департамент продаж дрогери', null from dual union all
       select 6 ,1 ,'Управление внедрения технологий', null from dual union all
       select 7 ,1 ,'Управление разработки и автоматизации', null from dual union all
       select 8 ,1 ,'Управление бизнес-аналитики', null from dual union all
       select 9 ,6 ,'Руководитель управления внедрения технологий', null from dual union all
       select 10 ,6 ,'Руководитель стратегических проектов', null from dual union all
       select 11 ,6 ,'Руководитель проекта', null from dual union all
       select 12 ,9 ,'Администратор проекта', null from dual union all
       select 13 ,9 ,'Старший менеджер', null from dual union all
       select 14 ,13 ,'Менеджер', null from dual union all
       select 15 ,7 ,'Руководитель управления разработки и автоматизации', null from dual union all
       select 16 ,15 ,'Старший менеджер', null from dual union all
       select 17 ,16 ,'Менеджер', null from dual union all
       select 18 ,8 ,'Руководитель управления бизнес-анализа', null from dual union all
       select 19 ,18 ,'Ведущий аналитик', null from dual union all
       select 20 ,19 ,'Аналитик бизнес-процессов', null from dual union all
       select 21 ,20 ,'Методист', null from dual union all
       select 22 ,2 ,'Сектор экономического анализа СООГМ', null from dual union all
       select 23 ,2 ,'Сектор анализа ассортимента СП ГМ/МС', null from dual union all
       select 24 ,2 ,'Сектор производственного учета', null from dual union all
       select 25 ,22 ,'Руководитель сектора', null from dual union all
       select 26 ,25 ,'Ведущий специалист', null from dual union all
       select 27 ,26 ,'Менеджер', null from dual union all
       select 28 ,27 ,'Специалист', null from dual union all
       select 29 ,24 ,'Старший специалист', null from dual union all
       select 30 ,29 ,'Специалист', null from dual union all
       select 31 ,23 ,'Руководитель сектора', null from dual union all
       select 32 ,31 ,'Аналитик', null from dual union all
       select 33 ,5 ,'Отдел методологии управления продажами', null from dual union all
       select 34 ,5 ,'Отдел по работе с потерями МК', null from dual union all
       select 35 ,34 ,'Начальник отдела', null from dual union all
       select 36 ,35 ,'Ведущий аналитик направления', null from dual union all
       select 37 ,35 ,'Ведущий специалист направления', null from dual union all
       select 38 ,37 ,'Специалист направления', null from dual union all
       select 39 ,36 ,'Аналитик направления', null from dual union all
       select 40 ,33 ,'Начальник отдела методологии управления', null from dual union all
       select 41 ,40 ,'Ведущий специалист', null from dual union all
       select 42 ,41 ,'Специалист направления', null from dual
)



Нарисуй желаемый результат.

Если я правильно понял, надо вернуть 1 лвл, 2 лвл, предпоследний лвл и последний лвл.
Что возвращать если всего 1 лвл?
...
Рейтинг: 0 / 0
25.07.2019, 10:38
    #39841257
rost.slv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
Насколько я понял, чтобы найти родителя второго уровня, нужно подняться вверх, до первого и спуститься вниз, но как это написать не представляю
...
Рейтинг: 0 / 0
25.07.2019, 10:39
    #39841259
rost.slv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
Dshedoo, просто вернуть этот лвл, ничего больше не нужно значит
...
Рейтинг: 0 / 0
25.07.2019, 10:40
    #39841260
rost.slv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
Dshedoo, предпоследний я сделал
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select prior name_v --вот здесь
      ,connect_by_root t.id_f as root_id
      ,connect_by_root t.name_v as root_name
      ,t.id_f as leaf_id
      ,t.name_v as leaf_name
      ,level as inc_level
  from rost_task3_irhy t
 where connect_by_isleaf = 1
 start with t.id_par is null
connect by t.id_par = prior t.id_f



проблема во втором уровне
...
Рейтинг: 0 / 0
25.07.2019, 12:31
    #39841337
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
rost.slvпроблема во втором уровне
Код: plsql
1.
sys_connect_by_path(case level when 2
...
Рейтинг: 0 / 0
25.07.2019, 12:56
    #39841348
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
rost.slvДля неё нужно найти все листы, корни этих листов,ближайшего родителя и родителя второго уровня (который после корня)Как подсказывает капитан очевидность, родитель второго уровня это ребенок первого уровня.
Из-за особенностей данных, корни всех листьев - NULL.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select connect_by_root t.id_f leaf,
       connect_by_root t.id_par direct_parent,
       id_f lvl_2_parent,
       prior id_f lvl_2_child,
       id_par root
  from rost_task3_irhy t
 where connect_by_isleaf = 1
start with not exists
              (select null
                 from rost_task3_irhy t0
                where t0.id_par = t.id_f)
connect by prior id_par = id_f;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
      LEAF DIRECT_PARENT LVL_2_PARENT LVL_2_CHILD       ROOT
---------- ------------- ------------ ----------- ----------
         3                          3                       
         4                          4                       
        10             6            1           6           
        11             6            1           6           
        12             9            1           6           
        14            13            1           6           
        17            16            1           7           
        21            20            1           8           
        28            27            2          22           
        30            29            2          24           
        32            31            2          23           
        38            37            5          34           
        39            36            5          34           
        42            41            5          33           

14 rows selected.
...
Рейтинг: 0 / 0
25.07.2019, 13:07
    #39841356
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
Тот же результат при раскрутке от корней.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select t.id_f leaf,
       t.id_par direct_parent,
       connect_by_root t.id_f lvl_2_parent,
       replace(sys_connect_by_path(decode(level, 2, t.id_f), '~'), '~') lvl_2_child,
       connect_by_root t.id_par root
  from rost_task3_irhy t
 where connect_by_isleaf = 1
start with id_par is null
connect by prior id_f = id_par
order by 1;
...
Рейтинг: 0 / 0
25.07.2019, 13:47
    #39841379
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ближайший родитель, потомок корневого родителя
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select regexp_substr(SYS_CONNECT_BY_PATH(name_v, '/'),'/.[^/]*',1,1)
     ||regexp_substr(SYS_CONNECT_BY_PATH(name_v, '/'),'/.[^/]*',1,2)
     ||case when level > 3 then regexp_substr(SYS_CONNECT_BY_PATH(name_v, '/'),'/.[^/]*',1,level-1) end
     ||case when level > 3 then regexp_substr(SYS_CONNECT_BY_PATH(name_v, '/'),'/.[^/]*($)',level) end as "вот такая вот херня"
, level as l 
, CONNECT_BY_ISLEAF as leaf
, SYS_CONNECT_BY_PATH(name_v, '/') as x
  from q
 where connect_by_isleaf = 1
 start with id_par is null
connect by prior id_f = id_par
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ближайший родитель, потомок корневого родителя / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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