Sql 动态地将supervisor节点更改为null

Sql 动态地将supervisor节点更改为null,sql,sql-server,tsql,Sql,Sql Server,Tsql,我从SQLServer数据库中提取员工数据以绘制组织结构图。我的公司有很多部门(我想每个公司都有)。我只想一次拉一个特定的部门 在我们的数据库中,每个部门负责人也向首席执行官或主席报告。。如何将部门主管的reportsToEmpId列(在运行时)更改为NULL?如果部门负责人的上级不属于本部门 以下是我的报表表结构: empId, name, reportsToEmpId, deptId 100, John, 99, 1 101, Mary, 100, 1 102, Carol, 100, 1

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

在我们的数据库中,每个部门负责人也向首席执行官或主席报告。。如何将部门主管的
reportsToEmpId
列(在运行时)更改为NULL?如果部门负责人的上级不属于本部门

以下是我的报表表结构:

empId, name, reportsToEmpId, deptId
100, John, 99, 1
101, Mary, 100, 1
102, Carol, 100, 1
99, Jim, null, 2
因为我只拉
deptId=1
,而
Jim
不是
dept1
。我可以动态地将John的reportsToEmpId列更改为空吗

select fields I need
from reportsTo r
join employee e on r.empId = e.empId
join groupHightlight h on ...
where deptId=1
我试图使用tmp表,但它似乎太麻烦了

原始输出:

empId, name, reportsToEmpId, deptId
    100, John, 99, 1
    101, Mary, 100, 1
    102, Carol, 100, 1
这是我的预期产出:(然而,我不希望对原始表格做任何更改,因为如果我想把向首席执行官报告的每个人都拉过来,那么我就失去了部门之间的“联系”)


您必须使用
自内部联接
来实现这一点

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 
更新T1
设置T1.reportsToEmpId=NULL
从报告到T1内部连接报告到T2
在T1.reportsToEmpid=T2.empId上
其中T1.deptid T2.deptid和T1.deptid=1

您可以在
empId
deptId
上保留join。如果报告对象的员工没有相同的
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

那么这里的输出是什么呢?您只提供了查询中三个表中的一个表的模糊信息。嗨,肖恩,谢谢。我更新了我的问题。(我在问题的底部添加了预期输出:-)我认为这就是答案,因为FuzzyTree的语句没有修改原始表。(这不会破坏部门之间的关系)。
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