基于层次表更新

时间:2014-08-18 08:37:53

标签: sql sql-server sql-update

我有一张员工表 - 有效或无效。结构如下

create table employee
(
id int,
supervisorid int,
active bit
)

另一个表Component包含类似..

的项目
create table component 
(
cid int,
empid int
)

加载了一些示例数据HERE

如何更新组件表,以便empid字段包含非活动员工的IMMEDIATE ACTIVE SUPERVISOR ID。在示例中,更新结果应该类似于

Component
---------
Cid  | empid
--------------
 1     1235 
 2     1246
 3     1246

我可以使用小提琴页面中提到的查询为特定员工生成层次结构表。

1 个答案:

答案 0 :(得分:0)

您可以使用递归CTE为每个非活动ID创建一个用于更新的表,其中第一个活动的supervisorID。在第一次迭代中,您选择所有活动ID's并将其BaseID设置为相同。在每次下一次迭代中,您选择其NON-ACTIVE子级的下一级添加到递归表并在每个记录中保存根BaseID。因此,当您添加所有记录时,每个BaseID的{​​{1}}字段是第一个ACTIVE父级。然后我们只留下ID我们需要更新ID's表中的Id<>BaseID}。然后使用此表ForUpd - &gt; Id更新原始表格。

BaseID

SQLFiddle demo