Drop Database

MERGE INTO

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

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

Merge는 여러 데이터 소스로부터 다양한 데이터를 수집해서 작업을 수행하는 dataware housing등에 적용하면 유용하다.

merge 문에서 where 절은 사용할 수 없으며 대신 on이 사용된다. 또한 when matched then 절과 when not matched then 절에는 테이블명 대신 alias를 사용한다.

【형식】
MERGE INTO 테이블명  별칭
USING 대상테이블/뷰  별칭
on 조인조건
WHEN MATCHED THEN
  UPDATE SET
	컬럼1=값1
	컬럼2=값2
WHEN NOT MATCHED THEN
  INSERT (컬럼1,컬럼2,...)
        VALUES(값1,값2,...);
【예제】
SQL> create table emp(
  2  id number primary key, 
  3  name varchar2(10) not null,
  4  salary  number,
  5  bonus number default 100);
Table created.
SQL> desc emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 NAME                                      NOT NULL VARCHAR2(10)
 SALARY                                             NUMBER
 BONUS                                              NUMBER
SQL> insert into emp(id,name,salary) values(1001,'jijoe',150);
SQL> insert into emp(id,name,salary) values(1002,'cho',130);
SQL> insert into emp(id,name,salary) values(1003,'kim',140);
SQL> select * from emp;
        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1001 jijoe             150        100
      1002 cho               130        100
      1003 kim               140        100
SQL> create table bonus(id number, bonus number default 100);
Table created.
SQL> insert into bonus(id)
  2    (select e.id from emp e);
3 rows created.
SQL> select * from bonus;
        ID      BONUS
---------- ----------
      1001        100
      1002        100
      1003        100
SQL> merge into bonus D
  2    using (select id,salary from emp) S
  3    on (D.id = S.id)
  4  when matched then update set
  5    D.bonus=D.bonus + S.salary*0.01
  6  when not matched then insert(D.id, D.bonus)
  7    values(S.id,S.salary*0.01);
3 rows merged.
SQL> select * from bonus;
        ID      BONUS
---------- ----------
      1001      101.5
      1002      101.3
      1003      101.4
SQL>
【예제】
SQL> delete from bonus where id=1003;
1 row deleted.
SQL> merge into bonus D
  2    using (select id,salary from emp) S
  3    on (D.id = S.id) 
  4  when matched then update set
  5    D.bonus=D.bonus + S.salary*0.02
  6  when not matched then insert(D.id, D.bonus)
  7    values(S.id, S.salary*0.01);
3 rows merged.
SQL> select * from bonus;
        ID      BONUS
---------- ----------
      1001      104.5
      1002      103.9
      1003        1.4

'Drop Database' 카테고리의 다른 글

SQL PLUS 잡다한 기능  (0) 2007.09.20
MERGE 를 이용한 ROW INSERT OR UPDATE  (0) 2007.09.20
오라클 접속방법  (0) 2007.09.20
오라클 힌트 사용법  (0) 2007.09.20
[스크랩] 윈도우 XP 60가지 팁  (0) 2007.09.18