Oracle 표 에서 중복 기록 을 찾 고 삭제 하 는 절차 방법

이 때 임시 표 에 중복 데이터 가 있 으 면 메 인 키 필드 businessid 가 중복 되 든 줄 전체 가 중복 되 든 유일한 메 인 키 제약 오 류 를 보고 합 니 다.
방법:group by XX having count(*)>1,rowid,distinct,temporary table,procedure
1.조회 표 의 중복 데이터 a.필드 반복
b.여러 필드 반복
c.줄 전체 반복
테스트 테이블 생 성:

create table cfa (businessid number,customer varchar2(50),branchcode varchar2(10),data_date varchar2(10));
insert into cfa values (1,'Albert','SCB','2011-11-11');
insert into cfa values (2,'Andy','DB','2011-11-12');
insert into cfa values (3,'Allen','HSBC','2011-11-13');

--------------- ----------------------------------------------
insert into cfa values (1,'Alex','ICBC','2011-11-14');
insert into cfa values (1,'Albert','CTBK','2011-11-15');
insert into cfa values (1,'Albert','SCB','2011-11-11');


a 의 경우 businessid 만 반복 합 니 다.

select * from cfa where businessid in (select businessid from cfa group by businessid having count(businessid)>1);
b 의 경우 businessid 와 name 이 중복 되 어 있 습 니 다

select * from cfa where (businessid,customer) in (select businessid,customer from cfa group by businessid,customer having count(*)>1);
c 의 경우 한 줄 을 반복 합 니 다.
b 참조 방법:

select * from cfa where (businessid,customer,branchcode,data_date) in (select * from cfa group by businessid,customer,branchcode,data_date having count(*)>1);
2.표 에 있 는 중복 데이터 a 상황 을 삭제 하고 표 에 있 는 중복 기록 을 삭제 합 니 다.중복 기록 은 하나의 필드(businessid)에 따라 판단 되 고 rowid 의 최소 기록 만 남 습 니 다.
또한 rowid 만 유지 할 수 있 습 니 다.최소 기록 이 아 닙 니 다.코드 에 있 는 min 을 max 로 바 꾸 어야 합 니 다.더 이상 군말 하지 않 습 니 다.
4.567913.또는 아래 의 더욱 간단 하고 효율 적 인 문 구 를 사용한다.

delete from cfa
where businessid in (select businessid
from cfa
group by businessid
having count(businessid) > 1)
and rowid not in (select min(rowid)
from cfa
group by businessid
having count(businessid) > 1);
b.경우,표 에 남아 있 는 중복 기록(여러 필드)을 삭제 하고 rowid 의 최소 기록 만 남 깁 니 다.

DELETE FROM cfa t
WHERE t.ROWID >
(SELECT MIN(X.ROWID) FROM cfa X WHERE X.businessid = t.businessid);
또는 아래 의 더 간단 하고 효율 적 인 문 구 를 사용한다.

delete from cfa
where (businessid,customer) in (select businessid,customer
from cfa
group by businessid,customer
having count(*) > 1)
and rowid not in (select min(rowid)
from cfa
group by businessid,customer
having count(*) > 1);
c 상황,이런 상황 은 비교적 간단 하 다.임시 표 방법 을 사용한다.

DELETE FROM cfa t
WHERE t.ROWID > (SELECT MIN(X.ROWID)
FROM cfa X
WHERE X.businessid = t.businessid
and x.customer = t.customer);

좋은 웹페이지 즐겨찾기