Рекурсивный CTE в Postgres - PullRequest
0 голосов
/ 11 января 2020

У меня есть таблица со структурой:

Employee_ID  Employee_Name  Manager_ID

И для каждого сотрудника мне нужно показать идентификатор топ-менеджера. Я имею в виду, если, например, у меня есть EmployeeID 2, менеджер которого равен 3, и, следовательно, номер 3 имеет менеджера номер 5, я должен показать:

Empoyee_ID--Top_Manager
2           5

Мне нужно сделать это с рекурсивный CTE в Postgres.

Ответы [ 2 ]

2 голосов
/ 11 января 2020

Это типичный рекурсивный запрос. Вот один из способов сделать это в Postgres:

with recursive cte as (
    select 1 lvl, employee_id, manager_id from mytable
    union all
    select c.lvl + 1, c.employee_id, t.manager_id
    from cte c
    inner join mytable t on t.employee_id = c.manager_id 
)
select distinct on (employee_id) employee_id, manager_id top_manager
from cte c
order by employee_id, lvl desc

Cte поднимается вверх по иерархии, отслеживая исходный идентификатор сотрудника и уровень отношений. Фильтры внешних запросов в топ-менеджере на сотрудника.

2 голосов
/ 11 января 2020

Что-то вроде (для менеджера уровня 2):

WITH RECURSIVE T AS
(
SELECT EMPLOYEE_ID, EMPLOYEE_NAME, MANAGER_ID, 1 AS MANAGER_LEVEL
FROM   MyTable
UNION  ALL
SELECT T.EMPLOYEE_ID, T.EMPLOYEE_NAME, E.MANAGER_ID, MANAGER_LEVEL + 1
FROM   MyTable AS E
       JOIN T ON T.MANAGER_ID = E.EMPLOYEE_ID
WHERE  T.MANAGER_LEVEL = 1 --> limiting to level 2 - 1
)
SELECT EMPLOYEE_ID, EMPLOYEE_NAME, MANAGER_ID
FROM   T 
WHERE  MANAGER_LEVEL = 2 --> retrieving only level 2, not level 1 and 2
...