Как правильно создать SQL запрос с использованием рекурсии?

Как сформулировать запрос, чтобы объединить список всех сотрудников под каждым менеджером в одной строке, вместо двух отдельных столбцов (менеджер и сотрудники), как на примере таблицы?
  • 4 июля 2024 г. 16:22
Ответы на вопрос 2
Для создания SQL запроса с использованием рекурсии, необходимо использовать команду WITH RECURSIVE, которая позволяет делать рекурсивные запросы.

Пример SQL запроса для объединения списка всех сотрудников под каждым менеджером в одной строке:

```
WITH RECURSIVE EmployeeTree AS (
    SELECT EmployeeID, ManagerID, Name, CAST(Name AS VARCHAR(1000)) AS Employees
    FROM Employees
    WHERE ManagerID IS NULL
    
    UNION ALL
    
    SELECT e.EmployeeID, e.ManagerID, e.Name, CONCAT(et.Employees, ', ', e.Name)
    FROM Employees e
    JOIN EmployeeTree et ON e.ManagerID = et.EmployeeID
)

SELECT ManagerID, MAX(Employees) AS Employees
FROM EmployeeTree
GROUP BY ManagerID
```

В данном примере таблица Employees содержит информацию о сотрудниках с полями EmployeeID, ManagerID и Name. Рекурсивный запрос EmployeeTree строит иерархию от менеджера к сотруднику, объединяя всех сотрудников под каждым менеджером в одной строке.

Далее используется команда GROUP BY для объединения всех сотрудников под каждым менеджером в одной строке.
То что ты хочешь - это excel-специфично, его формат отображения. Такого ты не получишь. 
Есть несколько вариантов как это можно сделать в один столбец.

1. В единственной строке отображай все ID

select e.manager_id::text || ' - ' || array_agg(id)::text
from employees as e
where e.manager_id is not null
group by e.manager_id
order by e.manager_id;


2. Добавляй паддинг для каждой строки (пустые строки)
with manager_groups as (
	select manager_id::text, array_agg('          ' || id::text) as ids
	from employees as e
	where e.manager_id is not null
	group by e.manager_id
	order by e.manager_id
)
select 
	x.id
from (
	select unnest(array_prepend(manager_id, ids)) as id
	from manager_groups
) as x;
Похожие вопросы