我有下表所示的表
| 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。
这是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 总是由组成
当先前的迭代没有输出时,终止将终止。