我有一个SQL表:
Id INT, Name NVARCHAR(MAX), OldName NVARCHAR(MAX)
名称列中有多个重复项。
我想删除这些重复项,只保留一个“名称”的主副本。当重复数据删除发生时,我想将旧名称连接到OldName字段。
E.G:
Dave | Steve
Dave | Will
会变成
Dave | Steve, Will
合并后。
我知道如何使用以下内容来删除数据:
with x as (select *,rn = row_number()
over(PARTITION BY OrderNo,item order by OrderNo)
from #temp1)
select * from x
where rn > 1
但不确定如何更新新的'主'记录。
答案 0 :(得分:2)
这在单个更新中实在太复杂了,因为您需要更新和删除行。
select n.name,
stuff((select ',' + t2.oldname
from sqltable t2
where t2.name = n.name
for xml path (''), type
).value('/', 'nvarchar(max)'
), 1, 1, '') as oldnames
into _temp
from (select distinct name from sqltable) n;
truncate table sqltable;
insert into sqltable(name, oldnames)
select name, oldnames
from _temp;
当然,在删除旧表之前进行测试,测试,测试(复制它以保证安全)。这不使用临时表。这样,如果在insert
完成之前发生了某些事情 - 比如服务器重启 - 您仍然拥有所有数据。
您的问题没有说明如何处理id
列。如果您要使用其中一个值,可以将min(id)
或max(id)
添加到_temp
。