(동영상)오라클 테이블에서 중복행(레코드) 삭제방법

오라클 테이블에서 중복행(레코드) 삭제방법  

 

------------------------------------------------------------

-- 오라클에서 중복 레코드 삭제하는 방법

-- How to delete duplicate records in oracle table

------------------------------------------------------------

 

-- 실습테이블 생성

drop table dup_test;

create table dup_test (

id number generated as identity,  -- Primary Key

name varchar2(100),

city   varchar2(100));

 

insert into dup_test (name, city) values ('가길동' , '서울');

insert into dup_test (name, city) values ('나길동' , '인천');

insert into dup_test (name, city) values ('다길동' , '대전');

insert into dup_test (name, city) values ('라길동' , '전주');

insert into dup_test (name, city) values ('바길동' , '부산');

insert into dup_test (name, city) values ('가길동' , '서울');  --중복

insert into dup_test (name, city) values ('나길동' , '인천');  --중복

 

commit;

 

select * from dup_test;

 

--1. 중복데이터 삭제 방법1(ROWID가 다르다는 것을 이용)

delete from dup_test a

where a.rowid > any (select b.rowid from dup_test b 

                          where a.name = b.name 

                          and a.city = b.city);

 

select * from dup_test;

rollback;  -- 삭제취소

 

-- 2. 중복데이터 삭제 방법2(주키, Primary Key가 다르다는 것을 이용)

delete from dup_test a

where a.id > (select min(b.id) from dup_test b 

                where a.name = b.name 

                and a.city = b.city);

                

select * from dup_test;

rollback;  -- 삭제취소              

 

-- 3. 중복데이터 삭제 방법3(중복되는 데이터의 ROWNUM을 이용)                

delete from dup_test a

where a.id in (select c.id

                 from (

                          select b.id, rownum rn

                          from dup_test b

                          where a.name = b.name 

                          and a.city = b.city

                        ) c

                where c.rn > 1

                 );

                 

select * from dup_test;

rollback;  -- 삭제취소

 

--4. 중복데이터 삭제 방법4(EXISTS 이용)      

delete from dup_test a

where EXISTS (select  1

                  from dup_test b

                  where a.name = b.name 

                  and a.city = b.city

                  group by b.name, b.city

                  having min(b.id) != a.id);

 

select * from dup_test;

rollback;  -- 삭제취소

 

--5. 중복데이터 삭제 방법4(JOIN을 이용)      

delete from dup_test a

where a.id in 

(

  select b.id

  from  dup_test b

  join   dup_test c on 

  (

    b.name = c.name 

    and b.city = c.city

    and b.id > c.id

  )

);

 

select * from dup_test;

rollback;  -- 삭제취소

 

--6. 중복데이터 삭제 방법6(NOT IN을 이용) 

delete from dup_test a

where (id, name, city) not in ( select min( id ), name, city 

                                     from dup_test 

                                     group by name, city );

                                     

select * from dup_test;

rollback;  -- 삭제취소

Comments