3

我的表格如下所示

| Employee ID | Manager ID |
|:-----------:|:----------:|
| E068        | E067       |
| E071        | E067       |
| E229        | E069       |
| E248        | E144       |
| E226        | E223       |
| E236        | E241       |
| E066        | E001       |
| E067        | E001       |
| E144        | E001       |
| E223        | E001       |
| E001        | Null       |
| E241        | Null       |

我们确实有包含“Leader ID”的表

| Leader ID |
|-----------|
| E001      |
| E241      |

问题陈述:

这个问题是通过使用员工及其经理数据来识别经理的负责人。

关于:我们有一个员工 ID 和他们的经理 ID。请注意,经理 ID 来自员工 ID。因为每个经理都有一个高于他们级别的经理。

首先,我们将在 Manager ID 列中获取所有 UNIQUE ID。然后对于 Manager ID 列中的每个 ID,我们将查找它们各自的 Manager ID(Manager) 然后我们将创建一个新的列名称Leader,其中将包含 Manager 的所有层次结构。

所需输出:

| Employee ID | Manager ID  | Leader ID |
|-------------|-------------|-----------|
| E068        | E067        | E001      |
| E071        | E067        | E001      |
| E229        | E069        | E001      |
| E248        | E144        | E001      |
| E226        | E223        | E001      |
| E236        | E241        | E241      |
| E066        | E001        | E001      |
| E067        | E001        | E001      |
| E144        | E001        | E001      |
| E223        | E001        | E001      |

Employee ID 列包含 UNIQUE ID,而 Manager ID 包含 DUPLICATES ID。

4

1 回答 1

0

这是WITH RECURSIVE的典型示例

使用 RECURSIVE,WITH 查询可以引用它自己的输出。

尝试这个:

with recursive subordinates as
  (select 
      employeid, 
      e.managerid, 
      e.managerid as leader 
   from employes e 
   where e.managerid in(select * from leaders) -- non recursive term
   union 
   select 
      e.employeid, 
      e.managerid, 
      a.managerid as leader 
    from employes e 
          join subordinates a on a.employeid = e.managerid -- recursive term
) select * from subordinates

如文档中所述:

A WITH RECUSCIVE总是由

  1. 非递归项
  2. UNIONUNION ALL
  3. 递归术语,唯一可以引用查询输出的术语

当前一次迭代没有输出时,recusion 终止。

于 2020-02-18T09:08:28.660 回答