Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Вывести иерархию организации  [new]
GenaV
Member

Откуда:
Сообщений: 3
Друзья, прошу помощи по составлению запроса.
Имеем 2 таблицы:

create table t_dept (
dept_id bigint not null,
dept_name VARCHAR(100),
primary key (dept_id));

create table t_emp (
EMP_ID bigint not null,
DEPT_ID bigint,
CHIEF_ID bigint,
EMP_NAME varchar(100),
SALARY bigint,
primary key (EMP_ID));

alter table t_emp
add constraint EMPLOYEE_EMPLOYEE_FK
foreign key (CHIEF_ID)
references t_emp;

alter table t_emp
add constraint EMPLOYEE_DEPARTMENT_FK
foreign key (DEPT_ID)
references t_dept;


Необходимо сделать запрос выводящий всю иерархию организации.
Отдел (сортировка по названию), под ним руководитель (сортировка по ФИО), под ним сотрудники(в порядке по уменьшению ЗП).
Или хотя бы подскажите куда копать, всю голову сломал...
17 окт 20, 16:33    [22215965]     Ответить | Цитировать Сообщить модератору
 Re: Вывести иерархию организации  [new]
MikeR.Ru
Member

Откуда:
Сообщений: 100
По классике иерархия всегда перебирается рекурсией.
MikeR.Ru
Для рекурсии используют CTE
Только надо понимать, что рекурсия сильно много потребляет ресурсов в любых языках.
Ну и реально лучше начать с изучения плана запроса.
18 окт 20, 08:28    [22216157]     Ответить | Цитировать Сообщить модератору
 Re: Вывести иерархию организации  [new]
mefman
Member

Откуда:
Сообщений: 3125
GenaV,
Тебе сюда 12561782
18 окт 20, 13:07    [22216254]     Ответить | Цитировать Сообщить модератору
 Re: Вывести иерархию организации  [new]
GenaV
Member

Откуда:
Сообщений: 3
MikeR.Ru, спасибо за ссылку!
18 окт 20, 16:30    [22216304]     Ответить | Цитировать Сообщить модератору
 Re: Вывести иерархию организации  [new]
GenaV
Member

Откуда:
Сообщений: 3
В результате получился вот такой код:

with recursive performers as (
select
EMP_ID,
EMP_NAME,
CHIEF_ID,
SALARY
from
t_emp
where
EMP_ID = 2
union
select
e.EMP_ID,
e.EMP_NAME,
e.CHIEF_ID,
e.SALARY
from
t_emp e
join performers f on f.EMP_ID = e.CHIEF_ID
)
select *
from
performers
order by SALARY;


Но в таком запросе рекурсия останавливается после вывода сотрудников только одного отдела (dept_id). Не совсем понимаю, как продолжить выборку по остальным оставшимся отделам и при этом выводить название отдела в итоговый результат...
18 окт 20, 17:04    [22216309]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить