将supervisor节点动态更改为null

Geo*_*ang 5 sql t-sql sql-server

我从SQL Server数据库中提取员工数据以绘制组织结构图.我的公司有很多部门(我认为每个公司都有).我只想一次拉一个特定的部门.

在我们的数据库中,每个部门负责人也向CEO或主席报告.如何reportsToEmpId将部门负责人的列(在运行时)更改为NULL?如果部门主管的父母不属于该部门.

这是我的报告到表结构:

empId, name, reportsToEmpId, deptId
100, John, 99, 1
101, Mary, 100, 1
102, Carol, 100, 1
99, Jim, null, 2
Run Code Online (Sandbox Code Playgroud)

因为我只拉deptId = 1,而Jim不是dept1.我可以动态改变JohnreportsToEmpIdNULL

select fields I need
from reportsTo r
join employee e on r.empId = e.empId
join groupHightlight h on ...
where deptId=1
Run Code Online (Sandbox Code Playgroud)

我试图使用tmp表,但它似乎太麻烦了.

原始输出:

empId, name, reportsToEmpId, deptId
    100, John, 99, 1
    101, Mary, 100, 1
    102, Carol, 100, 1
Run Code Online (Sandbox Code Playgroud)

这是我的预期输出:(但是,我不希望对原始表进行任何更改,否则如果我想拉动所有报告给CEO的人,那么我就失去了部门之间的"连接").

empId, name, reportsToEmpId, deptId
    100, John, NULL, 1
    101, Mary, 100, 1
    102, Carol, 100, 1
Run Code Online (Sandbox Code Playgroud)

Fuz*_*ree 1

您可以在empId和上进行左连接deptId。如果被报告的员工没有相同的信息deptId,那么reportsToEmpId将是null

select r.empId, r.name, r2.empId reportsToEmpId, r.deptId
from reportsTo r
left join reportsTo r2
    on r2.empId = r.reportsToEmpId and r.deptId = r2.deptId
where r.deptId=1
Run Code Online (Sandbox Code Playgroud)