💾DB

[ORACLE] MERGE INTO

이줭 2023. 7. 13. 15:02
728x90

쿼리를 작성하다보면 하나의 쿼리문으로 INSERT, UPDATE, DELETE 작업을 해야 하는 경우가 있다. 이런 경우 MERGE 문을 사용하여 간단하게 쿼리를 작성할 수 있다.

MERGE 문은 ORACLE 9i 부터 지원하고, MERGE문에 DELETE 절은 10g부터 지원한다.

단일테이블

단일테이블에 MERGE문을 사용하기 위해서는 USING 절에 테이블 대신 DUAL을 사용하면 된다.

MERGE INTO EMP
USING DUAL ON (A.EMPNO = 7788)
WHEN MATCHED THEN
    UPDATE
    SET A.DEPTNO = 20
WHEN NOT MATCHED THEN
    INSERT (A.EMPNO, A.ENAME, A.DEPTNO)
    VALUES (7788, 'SCOTT', 20);

JOIN 사용

MERGE INTO JOB A
USING EMP B ON (A.EMPNO = 7788 AND A.EMPNO = B.EMPNO)
WHEN MATCHED THEN
    UPDATE 
    SET A.JOB = B.JOB
    , A.DEPTNO = B.DEPTNO
WHEN NOT MATCHED THEN
    INSERT (A.EMPNO, A.JOB, A.DEPTNO)
    VALUES (A.EMPNO, B.JOB, B.DEPTNO);

서브쿼리 사용

MERGE INTO EMP A
USING (
    SELECT AA.EMPNO
    , AA.JOB
    , AA.DEPTNO
    FROM EMP AA, DEPT BB
    WHERE AA.EMPNO = 7788
    AND AA.DEPTNO = BB.DEPTNO) B
WHEN MATCHED THEN
    UPDATE
    SET A.JOB = B.JOB
    , A.DEPTNO = B.DEPTNO
WHEN NOT MATCHED THEN
    INSERT (A.EMPNO, A.JOB, A.DEPTNO)
    VALUES (B.EMPNO, B.JOB, B.DEPTNO);

WHERE 사용

오라클 10g 부터 UPDATE, DELETE 문에 WHERE 절 지원하고, INSERT 절에서 WHERE 절을 사용하면 오류 발생

MERGE INTO EMP A
USING DUAL ON (A.EMPNO = 7788)
WHEN MATCHED THEN
    UPDATE
    SET A.DEPTNO = 20
    WHERE A.JOB = 'ANALYST';

DELETE 사용

오라클 10g 부터 DELETE 문 지원

MERGE INTO EMP A 
USING DUAL ON (A.EMPNO = 7788)
WHEN MATCHED THEN
    UPDATE
    SET A.DEPTNO = 20
    WHERE A.JOB = 'ANALYST'
    DELETE
    WHERE A.JOB <> 'ANALYST';
728x90

'💾DB' 카테고리의 다른 글

[ORACLE] LIMIT  (0) 2023.11.13
[ORACLE] GROUP BY ROLLUP  (0) 2023.06.20
[ORACLE] NVL, NVL2, NULLIF, COALESCE  (0) 2023.06.19
[ORACLE] DECODE와 CASE  (0) 2023.06.19
[ORACLE] INDEX 타지 않는 경우 (feat. INDEX HINT)  (0) 2022.09.15