将supervisor节点动态更改为null

时间:2017-02-21 21:22:41

标签: sql sql-server tsql

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

由于我只提取deptId = 1Jim不是dept1。我可以动态地将John的{​​{1}}列更改为reportsToEmpId吗?

NULL

我试图使用tmp表,但它看起来太麻烦了。

原始输出:

select fields I need
from reportsTo r
join employee e on r.empId = e.empId
join groupHightlight h on ...
where deptId=1

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

empId, name, reportsToEmpId, deptId
    100, John, 99, 1
    101, Mary, 100, 1
    102, Carol, 100, 1

2 个答案:

答案 0 :(得分:2)

您必须使用Self Inner Join来实现此目标

UPDATE T1
SET T1.reportsToEmpId = NULL
FROM reportsTo T1 INNER JOIN reportsTo  T2
     ON T1.reportsToEmpid = T2.empId
WHERE   T1.deptid <> T2.deptId AND T1.deptID = 1 

答案 1 :(得分:1)

您可以在empIddeptId上保持联接。如果报告的员工不具有相同的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