[펌글] [Oracle] MERGE – 조건에 따라 INSERT,UPDATE 가 가능

By | 4월 16, 2009


* 링크

[ORACLE] MERGE INTO를 활용해 없는 데이터는 INSERT, 있는 데이터는 UPDATE를 해봅시다.

* 펌글

출처 : http://oracleclub.com/lectureview.action

MERGE

 - 한번에 조건에 따라 INSERT,UPDATE 가 가능합니다.
 - 해당 ROW가 있으면 UPDATE, 없으면 INSERT 문장이 실행 됩니다.
 
 
 ◈syntax
MERGE INTO target_table_name
      USING (table|view|subquery) ON (join condition)
WHEN MATCHED THEN
     UPDATE SET col1 = val1[, col2 = val2…]
WHEN NOT MATCHED THEN
     INSERT(...) VALUES(...)
 

 ◈ syntax 설명
 - INTO : DATA가 UPDATE되거나 INSERT될 TABLE이름을 지정 합니다.

 - USING : 대상 TABLE의 DATA와 비교한 후 UPDATE 또는 INSERT할 대상이 되는 DATA의 SOURCE 테이블 또는 뷰를 지정
 - ON  : UPDATE나 INSERT를 하게 될 조건으로, 해당 condition을 만족하는 DATA가 있으면 WHEN MATCHED 절을 실행하게 되고, 없으면 WHEN NOT MATCHED 이하를 실행하게 됩니다.

 - WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용

 - WHEN NOT MATCHED
: ON 조건절에 맞는 ROW가 없을 때 수행할 내용
 
 
-- scott유저로 접속
C:\>SQLPLUS scott/tiger
 
-- 테스트를 위한 테이블 생성
SQL>CREATE TABLE emp_test
    AS SELECT * FROM emp WHERE deptno = 10;
 
-- 부서번호가 10인 사원만 데이터가 생성되었습니다.
SQL>SELECT empno, ename, sal FROM emp_test
EMPNO ENAME        SAL
----- ---------- -----
 7782 CLARK       2450
 7839 KING        5000
 7934 MILLER      1300
 
 
-- 간단하게 emp_test테이블에 데이터가 있으면 급여를 10%인상하고 없으면
-- 새로 INSERT하는 예제 입니다
.
SQL>MERGE INTO emp_test et
    USING emp e
    ON(et.empno = e.empno)
 WHEN MATCHED THEN
    UPDATE SET et.sal = e.sal*1.1
 WHEN NOT MATCHED THEN
    INSERT VALUES (e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno)
14 행이 병합되었습니다.
 
 
-- 실행결과를 조회 해 봅니다.
SQL>SELECT empno, ename, sal FROM emp_test
EMPNO ENAME        SAL
----- ---------- -----
 7782 CLARK       2695
 7839 KING        5500
 7934 MILLER      1430
 7844 TURNER      1500
 7521 WARD        1250
 7654 MARTIN      1250
 7788 SCOTT       3000
 7698 BLAKE       2850
 7566 JONES       2975
 7499 ALLEN       1600
 7902 FORD        3000
 ...
14 개의 행이 선택되었습니다.

* 나의 샘플

        MERGE INTO frameone_auth_user t1
        USING DUAL <!-- 딱히 다른 테이블이 불필요해서 -->
            ON (t1.AUTH_CD = #AUTH_CD# AND t1.user_id = #USER_ID#)
        WHEN MATCHED THEN
         UPDATE SET reg_dtm = SYSDATE  <!-- dummy action -->
        WHEN NOT MATCHED THEN
         INSERT (auth_cd, user_id)
         VALUES (#AUTH_CD#, #USER_ID#)

* MS-SQL에서 사용하는 JOIN-UPDATE를 ORACLE 에서 구현하는 방법

    => MERGE INTO 문을 사용하여, MATCHED 까지만 쿼리를 작성한다.

* MERGE문의 USING절에 두 개 이상의 테이블 사용하기

    - USING 절 내부를 인라인뷰(inline-view)로 작성한다.

* MERGE문에서 WITH 구문으로 만든 테이블 사용하기

    - 문법적으로 WITH문은 반드시 SELECT 절을 동반해야 하므로 MERGE와 직접 연동할 수 없다.
    - USING 절 내부를 WITH 테이블을 포함하는 인라인뷰로 작성하여 해결한다.
    - 예시)

          MERGE INTO animalia d
          USING
          (
              WITH X AS 
              (
                   SELECT  'moo' AS COW, 'woof' AS CAT, 
                                 (SELECT MAX( DECIBELS ) 
                                      FROM ANIMALIA                  
                                    WHERE COW = 'moo' ) AS DECIBELS
                     FROM DUAL
              )
              SELECT * FROM X
          ) q
         ON
         (1 = 1)
          WHEN MATCHED THEN UPDATE SET d.cow = q.cow||' and more';

    - 출처 : http://stackoverflow.com/questions/6673806/oracle-with-clause-merge-syntax-error 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments