【问题标题】:Recursive CTE in PostgresPostgres 中的递归 CTE
【发布时间】:2020-01-11 08:59:12
【问题描述】:

我有一张表格,结构如下:

Employee_ID  Employee_Name  Manager_ID

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

Empoyee_ID--Top_Manager
2           5

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

【问题讨论】:

    标签: sql postgresql common-table-expression hierarchical-data recursive-query


    【解决方案1】:

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

    【讨论】:

      【解决方案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 和关系级别的同时向上爬升层次结构。外部查询过滤每个员工的最高经理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多