* 링크
[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