我有以下 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;
但这最终会更新整个表格,而不仅仅是上面返回的结果。
有什么建议吗?
答案 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);