いくつかのSQLServerから重複データの削除方法を教えます。

1751 ワード

転載先:http://www.jb51.net/article/22980.htm
方法1

 
declare @max integer,@id integer
declare cur_rows cursor local for select ,count(*) from group by having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from where = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
2つの方法は2つの意味で重複した記録があり、1つは完全に重複した記録、すなわちすべてのフィールドが重複した記録であり、2つは部分的なキーフィールドが重複した記録であり、例えばNameフィールドが重複しているが、他のフィールドは必ずしも繰り返したり繰り返したりしなくても無視できます。1、最初の繰り返しについては、比較的解決しやすく、使用する

 
select distinct * from tableName
重複記録なしの結果集が得られます。この表が重複した記録を削除する必要がある場合(重複記録は1つ残しておく)、以下の方法で削除できます。

 
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
このような重複が発生した原因は表の設計が不備で発生したためで、唯一の索引列を追加すれば解決できます。2、このような重複問題は通常、重複記録の中の第一の記録を保持することを要求します。操作方法は以下のように重複フィールドがあると仮定します。Addressは、この二つのフィールドの唯一の結果セットを得ることを要求します。

 
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最後のselectはNameを得ました。Addressは重複しない結果集(しかし、autIDフィールドが一つ多くなりました。実際に書く時はselect子文に書いてもいいです。この列は省略します。)先日書いたsqlデータベースの削除方法はsqlデータベースに対して繰り返し記録されています。最近、重複した記録を削除する必要がある人が分かりました。

 
delete from where in (select from group by having count( ) > 1) and id not in (select min(id) from group by having count( )>1)