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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깊이 중첩된 객체를 정확히 일치 검색 - PostgreSQL목차 * 🚀 * 🎯 * 🏁 * 🙏 JSON 객체 예시 따라서 우리의 현재 목표는 "고용주"사용자가 입력한 검색어(이 경우에는 '요리')를 얻고 이 용어와 정확히 일치하는 모든 사용자 프로필을 찾는 것입니다. 즐거운 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.