删除完全重复的行,只留下其中一行

时间:2012-08-02 12:26:28

标签: sql-server-2005

请假设我有一个表格,其中包含一定数量的未指定列数。

我想删除完全重复的行,这意味着所有列匹配相等的行,不包括重复的行,只保留1行。

我怎么能实现这个目标?

示例:SQL Server 2005,包含5列FIELD1, FIELD2, FIELD3, FIELD4, FIELD5的表:

5   3   2   A   J
3   5   2   A   J
5   3   2   A   J
5   3   2   A   J
8   B   8   A   K

第一行,第三行和第四行是重复的,因此您只需在表格中留下其中一行。

1 个答案:

答案 0 :(得分:1)

您可以使用row_number()为重复项分配数字,并删除rn大于1(单次出现或首次重复)的位置。

一个小测试,因为Sql Fiddle不可用ATM:

declare @t table (FIELD1 varchar(10), FIELD2 varchar(10), FIELD3 varchar(10), FIELD4 varchar(10), FIELD5 varchar(10))

insert into @t values ('5', '3', '2', 'A', 'J')
insert into @t values ('3', '5', '2', 'A', 'J')
insert into @t values ('5', '3', '2', 'A', 'J')
insert into @t values ('5', '3', '2', 'A', 'J')
insert into @t values ('8', 'B', '8', 'A', 'K')

; with g as (
  select *,
         row_number() over (partition by field1, field2, field3, field4, field5 
                            order by (select null)) rn
    from @t
)
delete g
where rn > 1

select *
from @t

缺点是您必须指定所有列。如果您希望避免这种情况,并且您的表没有外键并且未被任何引用,您可以将DISTINCT数据插入临时表TRUNCATE原始并从临时表重新插入。