根据EmployeeVersion列更新CurrentRecord列

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

我有下表包含每个员工的版本:

EmployeeId Status Department CurrentRecord EmployeeVersion
45         1      33         0             1
45         1      45         0             2
45         2      45         0             3

我想更新CurrentRecord并将其设置为EmployeeVersion最大的记录(因为它是最新版本),将其设置为1,如下所示:

EmployeeId Status Department CurrentRecord EmployeeVersion
45         1      33         0             1
45         1      45         0             2
45         2      45         1             3

这是我的查询:

UPDATE DimEmployeeSharedV1 
  SET CurrentRecord = 1 
WHERE EmployeeVersion = (
  SELECT MAX(e.EmployeeVersion)
  FROM DimEmployeeSharedV1 e
  WHERE e.EmployeeId = EmployeeId
  GROUP BY e.EmployeeId
)

我有以下错误:

子查询返回了多个值。当子查询遵循=,!=,,> =,或当子查询用作表达式。

sql sql-server tsql
2个回答
2
投票

您可以使用可更新的cte:

with ucte as (
     select v.*, row_number() over (partition by EmployeeId order by EmployeeVersion) as seq
     from DimEmployeeSharedV1 v
)
update ucte 
     set CurrentRecord = 1 
where seq = 1;

相关子查询也将起作用:

UPDATE v1
      SET v1.CurrentRecord = 1 
FROM DimEmployeeSharedV1 v1
WHERE v1.EmployeeVersion = (SELECT MAX(e.EmployeeVersion) 
                            FROM DimEmployeeSharedV1 e
                            WHERE e.EmployeeId = v1.EmployeeId
                           );

1
投票

Demo on db<>fiddle

; WITH cte as(
 select EmployeeId, max(EmployeeVersion) as EmployeeVersion
 from #A
 group by EmployeeId
)
update a
set CurrentRecord = 1
from #A a
inner join cte on a.EmployeeId = cte.EmployeeId and a.EmployeeVersion = cte.EmployeeVersion

输出

enter image description here

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