基于SELECT和版本记录的INSERT INTO

问题描述 投票:1回答:2

我有一个表,其中包含员工的当前状态,如下所示:

 SELECT EmployeeId ,OfficeId from EmpCurrent

输出如下:

EmployeeId OfficeId
54          67
64          57
89          23

而且我还有另一个表,其中包含雇员的完整历史记录,但未历史化的OfficeId除外(我从EmpCurrent中添加了要插入的OfficeId列NULL:]

SELECT EmployeeId ,Func AS [Function],OfficeId,Version from EmpHistory

输出如下所示,用于EmployeeId = 54:

EmployeeId Function OfficeId Version
54         Manager  NULL     1
54         Director NULL     2
54         HeadOf   NULL     3

我想从EmpCurrent获取OfficeId并将其插入每个员工的最后一个Version(最大版本)的EmpHistory中,我的输出如下:

EmployeeId Function OfficeId Version
54         Manager  NULL     1
54         Director NULL     2
54         HeadOf   67       3
sql sql-server tsql
2个回答
1
投票

demo on db<>fiddle

首先,您需要获取3个字段h.EmployeeId, c.OfficeId, max(Version) as MaxVersion

其次,使用2个条件h.OfficeId = cte.OfficeId]更新#EmpHistory表上的h.EmployeeId = cte.EmployeeId and MaxVersion = h.Version

完整代码

;with cte as( 
select h.EmployeeId, c.OfficeId, max(Version) as MaxVersion
from #EmpHistory h
inner join #EmpCurrent c on h.EmployeeId = c.EmployeeId
group by h.EmployeeId, c.OfficeId
)

update h
set h.OfficeId = cte.OfficeId
from #EmpHistory h
inner join cte on h.EmployeeId = cte.EmployeeId and MaxVersion = h.Version

输出

enter image description here


1
投票

如果需要join的最新值,则:

© www.soinside.com 2019 - 2024. All rights reserved.