다연이네

[days08] merge문 (통합, 병합) 본문

Oracle

[days08] merge문 (통합, 병합)

 다연  2020. 11. 9. 19:50
반응형

merge 문은 구조가 같은 두 개의 테이블을 비교하여 하나의 테이블로 합치기 위한 데이터 조작이다.
예를 들어, 하루에 수만건씩 발생하는 데이터를 하나의 테이블에 관리할 경우 대량의 데이터로 인해 질의문의 성능이 저하된다. 이런 경우 지점별로 별도의 테이블에서 관리하다가 년말에 종합 분석을 위해 하나의 테이블로 합칠 때 merge 문을 사용하면 편리하다.

merge하고자 하는 소스 테이블의 행을 읽어 타킷 테이블에 매치되는 행이 존재하면 새로운 값으로 UPDATE를 수행하고, 만일 매치되는 행이 없을 경우 새로운 행을 타킷 테이블에서 INSERT를 수행한다.

 

create table dept1
as 
   select *
   from dept;
   
select * from dept1;

create table dept2
as 
   select *
   from dept;

select * from dept2;

dept1
dept2

insert into dept2 values ( 50, 'KIM_GUN', 'COREA' );  -- dept2  새로운 레코드 추가
update dept2
set dname = 'LEE_GUN'
where deptno= 30;

select * from dept1;
select * from dept2;

commit;

 

dept1
dept2

위 두 테이블을 병합 작업

merge into dept1 d1
using dept2 d2
on ( d1.deptno = d2.deptno )
when matched then -- update
   update set   d1.dname = d2.dname, d1.loc = d2.loc
when not matched then -- insert
  insert values ( d2.deptno, d2.dname, d2.loc ) 
;

select * from dept1 ;

dept1

create table emp(
    id number primary key, 
    name varchar2(10) not null,
    salary  number,
    bonus number default 100
); 

insert into emp(id,name,salary) values(1001,'jijoe',150);
insert into emp(id,name,salary) values(1002,'cho',130);
insert into emp(id,name,salary) values(1003,'kim',140);
commit;
select * from emp;

create table bonus(
   id number
   , bonus number default 100
);

insert into bonus (id)
 ( select e.id from emp e );

commit;

select * from bonus;

merge into bonus D
    using (select id,salary from emp) S
    on ( D.id = S.id )
  when matched then 
     update set  D.bonus=D.bonus + S.salary*0.01
  when not matched then 
     insert(D.id, D.bonus)   values(S.id,S.salary*0.01);

select * from bonus;

-- 
delete from bonus
where id=1003;
commit;

bonus 테이블

 

반응형
Comments