SQL Server 中的完全递归雇员-老板关系

d29*_*907 4 sql sql-server recursive-query hierarchical-data

我需要获取直接或间接依赖某人的所有员工的姓名。使用本示例中的查询(来自https://rextester.com/WGVRGJ67798),

create table employee(
id int not null,
employee varchar(10) not null,
boss int null    
)

insert into employee values
(1,'Anna',null),
(2,'Bob',1),
(3,'Louis',1),
(4,'Sara',2),
(5,'Sophie',2),
(6,'John',4);

with boss as (
     select id, employee, boss, cast(null as varchar(10)) as name
     from employee 
     where boss is null
    
     union all 
    
     select e.id, e.employee, b.id, b.employee
     from employee e 
     join boss b on b.id = e.boss
 )

select * from boss
Run Code Online (Sandbox Code Playgroud)

我可以得到这个结果:

在此输入图像描述

但是,我需要看到这个:

在此输入图像描述

这就像显示一个人与他或她“下面”的所有员工之间所有可能的关系。

GMB*_*GMB 5

你可以颠倒这个逻辑:你可以从叶子开始,走向根部,而不是从老板(根)开始走向员工(叶子)。这可以让您随时生成中间关系:

with cte as (
     select e.id, e.employee, e.boss, b.employee name, b.boss new_boss
     from employee e
     left  join employee b on b.id = e.boss
     union all 
     select c.id, c.employee, c.new_boss, e.employee, e.boss
     from cte c 
     join employee e on e.id = c.new_boss
)
select id, employee, boss, name 
from cte
order by id, boss
Run Code Online (Sandbox Code Playgroud)

DB Fiddle 演示

编号 | 员工 | 老板| 姓名
-: | :----- | ---: | :---
 1 | 安娜| | 无效的
 2 | 鲍勃 | 1 | 安娜
 3 | 路易斯| 1 | 安娜
 4 | 萨拉 | 1 | 安娜
 4 | 萨拉 | 2 | 鲍勃
 5 | 苏菲 | 1 | 安娜
 5 | 苏菲 | 2 | 鲍勃
 6 | 约翰 | 1 | 安娜
 6 | 约翰 | 2 | 鲍勃
 6 | 约翰 | 4 | 莎拉