我有一个SQL表,它具有:
Id INT, Name NVARCHAR(MAX), OldName NVARCHAR(MAX)name列中有多个重复项。
我想删除这些副本,只保留一个主副本的“名称”。当发生dedupe时,我希望将旧名称连接到OldName字段中。
例如:
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但不知道如何更新新的“主人”的记录,而我在它。
发布于 2015-08-22 17:00:27
这实在是太复杂了,无法在单个更新中完成,因为您需要更新和删除行。
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中。
https://stackoverflow.com/questions/32158561
复制相似问题