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 |