0

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

我想删除完全重复的行,这意味着所有列都相等匹配的行,忽略重复的行并只保留 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

第一行、第三行和第四行是重复的,所以你必须在表中只留下其中一个。

4

1 回答 1

1

您可以使用row_number()将数字分配给重复项并删除rn大于一的位置(单次出现或第一次重复)。

一个小测试,因为 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原始表并从临时表重新插入。

于 2012-08-02T13:01:16.127 回答