sql重複データの削除の詳細方法
一.重複した記録を完全に削除する
完全に繰り返されるデータは、通常、プライマリキー/一意キー制約が設定されていないためである。試験データ:
DISTINCTを利用してシングルレコードを取得し、ソースデータを削除し、重複記録を返さないように導く。表が大きくないなら、すべての記録を一回エクスポートして、それからtruncate表を導いて、deleteのログ操作を避けることができます。
二.削除部分の重複記録
一部の列で繰り返されるデータは、通常テーブルに主キーがあります。プログラム論理が複数行のデータ列の値を繰り返す可能性があります。試験データ:
唯一の索引には、繰り返しを無視するオプションがあります。プライマリキー制約/一意キー制約の作成には、このインデックスオプションが使用できます。
完全に繰り返されるデータは、通常、プライマリキー/一意キー制約が設定されていないためである。試験データ:
if OBJECT_ID('duplicate_all') is not null
drop table duplicate_all
GO
create table duplicate_all
(
c1 int,
c2 int,
c3 varchar(100)
)
GO
insert into duplicate_all
select 1,100,'aaa' union all
select 1,100,'aaa' union all
select 1,100,'aaa' union all
select 1,100,'aaa' union all
select 1,100,'aaa' union all
select 2,200,'bbb' union all
select 3,300,'ccc' union all
select 4,400,'ddd' union all
select 5,500,'eee'
GO
(1)臨時表を借りるDISTINCTを利用してシングルレコードを取得し、ソースデータを削除し、重複記録を返さないように導く。表が大きくないなら、すべての記録を一回エクスポートして、それからtruncate表を導いて、deleteのログ操作を避けることができます。
if OBJECT_ID('tempdb..#tmp') is not null
drop table #tmp
GO
select distinct * into #tmp
from duplicate_all
where c1 = 1
GO
delete duplicate_all where c1 = 1
GO
insert into duplicate_all
select * from #tmp
(2)ROW_を使用する。NUMBER
with tmp
as
(
select *,ROW_NUMBER() OVER(PARTITION BY c1,c2,c3 ORDER BY(getdate())) as num
from duplicate_all
where c1 = 1
)
delete tmp where num > 1
複数の表に完全に重複した行がある場合は、ユニオンによって複数の表を結合し、新たな同構造の表に挿入することが考えられ、SQL Serverは表と表の間の重複行の削除を助ける。二.削除部分の重複記録
一部の列で繰り返されるデータは、通常テーブルに主キーがあります。プログラム論理が複数行のデータ列の値を繰り返す可能性があります。試験データ:
if OBJECT_ID('duplicate_col') is not null
drop table duplicate_col
GO
create table duplicate_col
(
c1 int primary key,
c2 int,
c3 varchar(100)
)
GO
insert into duplicate_col
select 1,100,'aaa' union all
select 2,100,'aaa' union all
select 3,100,'aaa' union all
select 4,100,'aaa' union all
select 5,500,'eee'
GO
(1)一意の索引唯一の索引には、繰り返しを無視するオプションがあります。プライマリキー制約/一意キー制約の作成には、このインデックスオプションが使用できます。
if OBJECT_ID('tmp') is not null
drop table tmp
GO
create table tmp
(
c1 int,
c2 int,
c3 varchar(100),
constraint UQ_01 unique(c2,c3) with(IGNORE_DUP_KEY = ON)
)
GO
insert into tmp
select * from duplicate_col
select * from tmp
(2)メインキー/一意キーによって、通常はメインキー/一意キーの最大/最小値保持が選択され、他の行は削除される。以下は重複記録の中でc 1の最小行のみを保持します。
delete from duplicate_col
where exists(select 1 from duplicate_col b where duplicate_col.c1 > b.c1 and (duplicate_col.c2 = b.c2 and duplicate_col.c3 = b.c3))
--または
delete from duplicate_col
where c1 not in (select min(c1) from duplicate_col group by c2,c3)
は、重複した記録のN番目の行を保持するためには、05.パケットのいくつかの行を参照することができる。3)ROW_NUMBERと完全重複記録の削除は基本的に同じです。
with tmp
as
(
select *,ROW_NUMBER() OVER(PARTITION BY c2,c3 ORDER BY(getdate())) as num
from duplicate_col
)
delete tmp where num > 1
select * from duplicate_col
SQL削除重複データは一つしか残していません。(以下のコードで、多くのユーザーがエラーをフィードバックして、みんなで多くテストします。)SQL文で、重複項目を削除して、何千条の記録に一つだけ残して、同じ記録があります。SQL文を使って、重複したものを削除するにはどうすればいいですか?重複記録は、シングルフィールドに基づいてselect*from people where peopleId in(select peopleId from people group by peopleId having count)2、削除テーブルに余分な重複記録があり、重複記録は単一フィールド(peoplefrom)によってのみ判定されます。 peopleName in(select peopleName) from people group by peopleName having count(peopleName)>1)and peopleId not in(select min(peopleId)from people group by peopleName having count(peopleName)>1)3、ルックアップテーブルに余分な重複記録(複数のフィールド)select*from vitae a where(a.peopleId,a.seq)in(select peopleId,seq from vitae group by peopleId,seq Having count(*4)は、複数のテーブルが重複しています。a.seq in(select peopleId、seq from vitae group bypeopleId、seq having count(*)>1)and rowid not in(select min(rowid)from vitae group bypeopleId、seq having count(*)1))1))and rororororororororoeeefrerereeeeeeeeeeeeeffffroroeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffroroeeeeeeeeeeeeeeect peopleId、seq from vitae group by peopleId,seq having count(*)>1)and rowid not in(select min(rowid)from vitae group by peopleId,seq having count(*)1) 6.一つのフィールドの左の第一位を削除する:udate table_Name set[Title]=Right([Title]),(len([Title])-1))where Title'村%7.一つのフィールドの右の第一位を削除する:udate tableble Naset[Title]=left(Title)=lettle)=Title)=Title)=Title[Title](Title](Title](Title)=Title)=Title)=Title)=Title.[Title](Title](Title](Title)=Title)=Tirowid最小の記録を含まないudate vitae set ispass=-1 where peopleId in(select peopleId from vitae group by peopleId)