请假设我有一个表格,其中包含一定数量的未指定列数。
我想删除完全重复的行,这意味着所有列匹配相等的行,不包括重复的行,只保留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
第一行,第三行和第四行是重复的,因此您只需在表格中留下其中一行。
答案 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
原始并从临时表重新插入。