一尘不染

我想在SQL中使用递归返回新列吗?

sql

我有下表所示的表

| 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       |

我们有包含“领导者ID”的表

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

问题陈述:

此问题是通过使用Employee及其Manager数据来确定Manager的负责人。

关于:我们有一个员工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      |

雇员ID列包含UNIQUE ID,而经理ID列包含DUPLICATES ID。


阅读 215

收藏
2021-03-08

共1个答案

一尘不染

这是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

如文档中所述:

一个 WITH RECURSCIVE 总是由组成

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

当先前的迭代没有输出时,终止将终止。

2021-03-08