首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL:调试表数据和操作合并数据

SQL:调试表数据和操作合并数据
EN

Stack Overflow用户
提问于 2015-08-22 16:52:22
回答 1查看 166关注 0票数 1

我有一个SQL表,它具有:

代码语言:javascript
运行
复制
Id INT, Name NVARCHAR(MAX), OldName NVARCHAR(MAX)

name列中有多个重复项。

我想删除这些副本,只保留一个主副本的“名称”。当发生dedupe时,我希望将旧名称连接到OldName字段中。

例如:

代码语言:javascript
运行
复制
Dave | Steve
Dave | Will

会变成

代码语言:javascript
运行
复制
Dave | Steve, Will

在合并之后。

我知道如何使用这样的方法来解除数据的欺骗:

代码语言:javascript
运行
复制
    with x as   (select  *,rn = row_number()
            over(PARTITION BY OrderNo,item  order by OrderNo)
            from    #temp1)

select * from x
where rn > 1

但不知道如何更新新的“主人”的记录,而我在它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-22 17:00:27

这实在是太复杂了,无法在单个更新中完成,因为您需要更新和删除行。

代码语言:javascript
运行
复制
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中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32158561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档