首页 > 解决方案 > Postgres 中的递归 CTE

问题描述

我有一个结构表:

Employee_ID  Employee_Name  Manager_ID

而且,对于每个员工,我需要显示最高经理 ID。我的意思是,例如,如果我的 EmployeeID 为 2,其经理为 3,因此编号 3 的经理编号为 5,我必须显示:

Empoyee_ID--Top_Manager
2           5

我需要在 Postgres 中使用递归 CTE 来做到这一点。

标签: sqlpostgresqlcommon-table-expressionhierarchical-datarecursive-query

解决方案


类似于(对于 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

推荐阅读