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

1 行目、3 行目、4 行目は重複しているため、テーブルに 1 つだけ残す必要があります。

4

1 に答える 1

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から再挿入します。

于 2012-08-02T13:01:16.127 に答える