更新从 Select 语句返回的值

时间:2021-04-06 14:09:52

标签: sql sql-server

我有以下 sql 查询返回所有重复项(最近的除外)。

select *
from CodeData
inner join 
    (select max(cdID) as lastId, cdName
     from CodeData
     where cdName in (select cdName from CodeData
                      group by cdName
                      having count(*) > 1)
     group by cdName) duplic on duplic.cdName = CodeData.cdName
where CodeData.cdID < duplic.lastId;

我将如何为上述查询中返回的每个结果更新一列?假设我有一个任意列 A,我在查询结束时正在考虑类似的事情。

update CodeData 
set A = 0 
where CodeData.cdID < CodeData.duplic.lastId;

但这最终会更新整个表格,而不仅仅是上面返回的结果。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

使用可更新的 CTE 和窗口函数:

with toupdate as (
      select cd.*,
             row_number() over (partition by cdName order by cdId desc) as seqnum
      from codedata cd
     ) 
update toupdate
    set a = 0
    where seqnum > 1;

注意:您可能会发现 row_number() 足以处理“重复”问题,您根本不需要存储额外的列。

你可能真的想要:

update toupdate
    set a = (case when seqnum > 1 then 0 else 1 end);