본문 바로가기

DataBase/Oracle

Merge 사용하기

- 문법
MERGE INTO table_name alias
          USING (table|view|subquery) alias
          ON (join condition)
          WHEN MATCHED THEN
                       UPDATE SET col1 = val1[, col2 = val2…]
          WHEN NOT MATCHED THEN
                       INSERT (컬럼리스트) VALUES (값들....);


MERGE는 UPDATE와 INSERT를 결합한 문장으로 각각의 쓰임새는 다음과 같다.
INTO clause : data가 update 되거나 insert될 table 이름
USING clause : 대상 table의 data와 비교한 후  update 또는 insert할 때 사용할 data의 source.  
ON clause : update나 insert를 하게 될 condition으로, 해당 condition을 만족하는 row가 있으면 WHEN MATCHED 이하를 실행하게 되고, 없으면 WHEN NOT MATCHED 이하를 실행하게 된다.
WHEN MATCHED : ON clause의 조건이 TRUE인 row에 수행할 내용
WHEN NOT MATCHED : ON clause의 조건에 맞는 row가 없을 때 수행할 내용

--------------------------------------------- 예
SQL> create table emp_history (
  2  empno number(4) not null primary key,
  3  mydate date,
  4  salary number(7,2));

테이블이 생성되었습니다.

SQL> MERGE INTO emp_history eh
  2        USING emp e
  3        ON (e.empno = eh.empno)
  4  WHEN MATCHED THEN
  5        UPDATE SET eh.salary = e.sal
  6  WHEN NOT MATCHED THEN
  7        INSERT VALUES (e.empno, sysdate, sal);

14 행이 병합되었습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> select * from emp_history;

     EMPNO MYDATE       SALARY
---------- -------- ----------
      7844 04/01/06       1500
      7839 04/01/06
      7782 04/01/06       2450
      7521 04/01/06       1250
      7654 04/01/06       1250
      7788 04/01/06       3000
      7698 04/01/06       2850
      7566 04/01/06       2975
      7499 04/01/06       1600
      7934 04/01/06       1300
      7902 04/01/06       3000
      7369 04/01/06        800
      7876 04/01/06       1100
      7900 04/01/06        950

14 개의 행이 선택되었습니다. 

 

'DataBase > Oracle' 카테고리의 다른 글

LOCK 문제 확인과 해결 방법  (0) 2008.04.28
데이터사전 정보조회  (0) 2008.04.28
실행계획 해석하기(1)  (0) 2008.04.28
실행계획 해석하기(Nested Loops Join)  (0) 2008.04.28
실행계획 SQL 연산(CONCATENATION)  (0) 2008.04.28