powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ближайший родитель, потомок корневого родителя
9 сообщений из 9, страница 1 из 1
Ближайший родитель, потомок корневого родителя
    #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
Ближайший родитель, потомок корневого родителя
    #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
Ближайший родитель, потомок корневого родителя
    #39841257
rost.slv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял, чтобы найти родителя второго уровня, нужно подняться вверх, до первого и спуститься вниз, но как это написать не представляю
...
Рейтинг: 0 / 0
Ближайший родитель, потомок корневого родителя
    #39841259
rost.slv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo, просто вернуть этот лвл, ничего больше не нужно значит
...
Рейтинг: 0 / 0
Ближайший родитель, потомок корневого родителя
    #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
Ближайший родитель, потомок корневого родителя
    #39841337
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rost.slvпроблема во втором уровне
Код: plsql
1.
sys_connect_by_path(case level when 2
...
Рейтинг: 0 / 0
Ближайший родитель, потомок корневого родителя
    #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
Ближайший родитель, потомок корневого родителя
    #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
Ближайший родитель, потомок корневого родителя
    #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
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ближайший родитель, потомок корневого родителя
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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