如何在SQL Server中高效更新树形结构的MyTeam字段
用单条UPDATE语句高效填充MyTeam字段
针对你的层级结构表,我们可以通过**递归CTE(公共表表达式)**获取每个职位及其所有下属的职位列表,再用字符串聚合函数快速拼接,最终完成批量更新。以下是具体实现:
假设你的表名为JobHierarchy,执行以下语句即可:
WITH RecursiveJobs AS ( -- 锚点成员:初始节点(每个职位自身) SELECT ID, Job, ID AS RootID FROM JobHierarchy UNION ALL -- 递归成员:获取所有下级职位 SELECT j.ID, j.Job, r.RootID FROM JobHierarchy j INNER JOIN RecursiveJobs r ON j.ParentID = r.ID ) UPDATE jh SET MyTeam = agg.JobList FROM JobHierarchy jh INNER JOIN ( SELECT RootID, STRING_AGG(Job, ', ') AS JobList FROM RecursiveJobs GROUP BY RootID ) agg ON jh.ID = agg.RootID;
关键说明:
- 递归CTE
RecursiveJobs:先把每个职位作为根节点,再通过ParentID关联遍历所有层级的下属,将所有下属职位绑定到对应的根节点上。 - 字符串聚合:使用
STRING_AGG(SQL Server 2017+支持)将同一根节点下的职位拼接成逗号分隔的字符串;若用更低版本,可替换为STUFF((SELECT ', ' + Job FROM RecursiveJobs WHERE RootID = r.RootID FOR XML PATH('')), 1, 2, '')实现相同效果。 - 批量更新:通过聚合结果关联原表,一次性完成所有
MyTeam字段的更新,彻底避免循环带来的性能损耗。
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

