sql 중복 데 이 터 를 삭제 하 는 자세 한 방법

5214 단어 sql중복 데이터
완전히 중복 되 는 기록 삭제
완전히 중복 되 는 데 이 터 는 보통 메 인 키/유일한 키 제약 이 설정 되 어 있 지 않 기 때 문 입 니 다.테스트 데이터:

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)사용 ROWNUMBER

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
만약 여러 테이블 이 완전히 중 복 된 줄 이 있다 면 UNION 을 통 해 여러 테이블 을 연결 하여 새로운 같은 구조의 테이블 에 삽입 하 는 것 을 고려 할 수 있다.SQL Server 는 테이블 과 테이블 사이 의 중 복 된 줄 을 없 애 는 데 도움 을 줄 것 이다.
2.중복 되 는 부분 기록 삭제
일부 열 이 중복 되 는 데 이 터 는 보통 표 에 메 인 키 가 있 는데 프로그램 논리 가 여러 줄 의 데이터 열 값 을 중복 시 켰 을 수 있 습 니 다.테스트 데이터:

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)메 인 키/유일한 키 를 통 해 삭제 합 니 다.보통 메 인 키/유일한 키 의 최대/최소 값 을 선택 하고 다른 줄 은 삭제 합 니 다.다음은 중복 기록 중 c1 의 가장 작은 줄 만 유지 합 니 다.

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 문 구 를 사용 하여 중복 되 는 것 을 삭제 할 수 있 습 니까?1.표 에 있 는 중복 기록 을 찾 습 니 다.중복 기록 은 하나의 필드(peopleid)에 따라 select*from people where peopleid in(select peopleid from people group by peopleid having count(peopleid)>1)2.표 에 남아 있 는 중복 기록 을 삭제 하고 중복 기록 은 하나의 필드(peopleid)에 따라 판단 하 며 rowid 의 최소 기록 만 남 겨 두 고 delete from people where   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(*)>1)4,테이블 에 남아 있 는 중복 기록 삭제(여러 필드),rowid 최소 기록 delete from vitae a where(a.peopleId,a.seq)in(select 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)5,테이블 에 남아 있 는 중복 기록(여러 필드)을 찾 습 니 다.rowid 최소 기록 select*from vitae a where(a.peopleid,a.seq)in(select 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.한 필드 의 왼쪽 첫 번 째 제거:update tableName set[Title]=Right([Title],(len([Title])-1)where Title like'마을%'7.한 필드 의 오른쪽 첫 번 째 제거:update tableName set[Title]=left([Title],(len([Title])-1)where Title like'%마을'8.표 에 남아 있 는 중복 기록(여러 필드)을 삭제 합 니 다.rowid 최소 기록 update vitae set ispass=-1where peopleid in(select peopleid from vitae group by peopleid

좋은 웹페이지 즐겨찾기