基于SELECT的SQL操作:为员工历史表最新版本填充OfficeId
嘿,我来帮你搞定这个员工历史表的OfficeId填充问题!
解决方案:给员工历史表的最新版本记录填充OfficeId
先明确咱们的目标:针对每个员工,找到他们在EmpHistory表中**版本号最大(也就是最新)**的那条记录,然后把EmpCurrent表中对应的OfficeId给填进去。
方法一:用CTE(公共表表达式)定位最新记录
这种写法逻辑清晰,先把每个员工的最新版本号找出来,再关联更新:
WITH LatestEmpHistory AS ( -- 先找出每个员工的最大版本号 SELECT EmployeeId, MAX(Version) AS MaxVersion FROM EmpHistory GROUP BY EmployeeId ) -- 关联最新记录和当前状态表,更新OfficeId UPDATE eh SET eh.OfficeId = ec.OfficeId FROM EmpHistory eh JOIN LatestEmpHistory leh ON eh.EmployeeId = leh.EmployeeId AND eh.Version = leh.MaxVersion JOIN EmpCurrent ec ON eh.EmployeeId = ec.EmployeeId;
方法二:用子查询直接关联
如果你的数据库版本不支持CTE,也可以用子查询来实现同样的效果:
UPDATE eh SET eh.OfficeId = ec.OfficeId FROM EmpHistory eh JOIN EmpCurrent ec ON eh.EmployeeId = ec.EmployeeId -- 筛选出当前员工的最新版本记录 WHERE eh.Version = ( SELECT MAX(Version) FROM EmpHistory WHERE EmployeeId = eh.EmployeeId );
验证更新结果
执行完更新后,你可以用下面的SQL检查是否符合预期:
SELECT EmployeeId, [Function], OfficeId, Version FROM EmpHistory ORDER BY EmployeeId, Version;
拿你给出的EmployeeId=54的例子来说,就能看到Version=3的记录OfficeId已经变成67,其他历史版本还是保持NULL,完全符合你想要的结果。
小提醒
- 要确保
EmpCurrent表的EmployeeId是唯一的(毕竟是存当前状态的表,正常来说不会有重复员工ID),避免关联时出现一对多的情况导致更新出问题。 - 如果某个员工在
EmpHistory里只有一条记录,这条记录会被自动当成最新版本,同样会被填充OfficeId。
内容的提问来源于stack exchange,提问作者user9517769
相关产品推荐
相关产品推荐

