You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:07:36