SQL:重复数据删除表数据并操纵合并数据

时间:2015-08-22 16:52:22

标签: sql sql-server

我有一个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

但不确定如何更新新的'主'记录。

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