簡體   English   中英

Postgres 中的遞歸 CTE

[英]Recursive CTE in Postgres

我有一個結構表:

Employee_ID  Employee_Name  Manager_ID

而且,對於每個員工,我需要顯示最高經理 ID。 我的意思是,例如,如果我有 EmployeeID 2,其經理為 3,因此,數字 3 的經理為 5,我必須顯示:

Empoyee_ID--Top_Manager
2           5

我需要在 Postgres 中使用遞歸 CTE 來做到這一點。

類似於(對於 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

這是一個典型的遞歸查詢。 這是在 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 在跟蹤原始員工 ID 和關系級別的同時向上爬升。 外部查詢過濾每個員工的最高經理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM