如何去重一个SQL Server表

本文详细介绍了如何在SQLServer环境下,通过创建临时表和利用自增列实现表去重操作,借鉴了Oracle中使用rowid伪列和row_number()分析函数的方法。步骤包括创建临时表、加载重复记录、删除重复记录、使用自增列进行去重以及最终将去重结果回填原表。
前面我写了个博客记录如何去重一个oracle表( link), 主要是利用了oracle的rowid伪列和row_number()分析函数. 有读者写邮件问, 如何去重一个SQL Server表, 场景和前面文章一样, 即: 有部分字段有重复值, 表结构中没有一个能唯一定位的ID列, 也不允许修改表结构. 下面我给了个基本的思路.


--步骤0, 根据原表table_a, 创建一个临时表table_a_temp, 仅仅增加了一个自增列row_id, 原因是SQL Server没有类似Oracle的rowid伪列, 我们就自己造一个. 
--假设原表的结果为: create table table_a (pk int, other_field char(10));
create table table_a_temp (pk int, other_field char(10), row_id int IDENTITY(1,1) NOT NULL);
--步骤1, 将重复PK的记录加载到临时表table_a_temp
truncate table table_a_temp ;
insert into table_a_temp(pk, other_field) select pk, other_field from table_a a group by pk, other_field having count(*)>1 ;
--步骤2, 删除所有重复PK的记录, 这不是去重
--SQL Server 关联delete的写法有点诡异 delete table_a from table_a
delete table_a  from table_a  b  inner join
(
select pk,other_field from table_a a group by pk, other_field having count(*)>1
) c
on b.pk=c.pk and b.other_field=c.other_field ;
--步骤3, 重表table_a_temp. 因为table_a_temp表有一个自增字段row_id, 这时候, 我们就可以利用row_id来去重
--代码略, 可参考oracle版本的代码(link)
--步骤4, 将去重后的table_a_temp记录补会到原表table_a, 这样table_a就没有重复的pk
insert into table_a (pk, other_field) select pk, other_field from table_a_temp ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值