이번 포스팅에서는 SQLD 자격증 공부를 진행하다가 오라클에서 제공하는 문법인 MERGE INTO 구문 사용 방법에 대해 알아보려고 합니다.
MERGE ?
- MERGE 문은 조건에 따라 데이터의 삽입, 갱신, 삭제 작업을 한번에 할 수 있게 해주는 문입니다.
- 해당 행이 존재하는 경우 UPDATE or DELETE 문을 수행하고, 새로운 행인 경우 INSERT 문을 수행합니다.
- 대상 테이블에 대한 UPDATE/INSERT 조건은 ON 절에 결정 됩니다.
[ MERGE SYNTAX ]
MERGE [hint]
INTO [schema]{table|view}[t_alias]
USING{[schema]{table|view} | subquery}[t_alias]
ON (condition)
WHEN MATCHED THEN
UPDATE SET column = {expr|DEFAULT}
[, column = {expr|DEFAULT}]...
[DELETE where_clause]
WHEN NOT MATCHED THEN
INSERT [(column [, column]...)]
VALUES({expr[,expr]...|DEFAULT})
- INTO : DATA가 UPDATE 되거나 INSERT 될 테이블 또는 뷰를 지정
- USING : 비교할 SOURCE 테이블 또는 뷰나 서브쿼리를 지정, INTO 절의 테이블과 동일하거나 다를 수 있다.
- ON : UPDATE나 INSERT를 하게 될 조건
- 해당 조건 만족하는 DATA : WHEN MATCHED THEN 절 실행
- 해당 조건 만족하는 DATA 없으면 : WHEN NOT MATCHED THEN 절 실행
- WHEN MATCHED THEN : ON 조건절이 TRUE인 ROW에 수행할 내용 (UPDATE, DELETE 가능)
- WHEN NOT MATCHED THEN : ON 조건절에 맞는 ROW가 없을 때 수행할 내용 (INSERT)
예시
[TEST1]
COL1 COL2 COL3
------------------
A X 1
B Y 2
C Z 3
[TEST2]
COL1 COL2 COL3
------------------
A X 1
B Y 2
C Z 3
D 가 4
E 나 5
[SQL]
MERGE INTO TEST1
USING TEST2
ON (TEST1.COL1 = TEST2.COL1)
WHEN MATCHED THEN
UPDATE SET TEST1.COL3 = 4
WHERE TEST1.COL3 = 2
DELETE WHERE TEST1.COL3 <= 2
WHEN NOT MATCHED THEN
INSERT(TEST1.COL1, TEST1.COL2, TEST1.COL3)
VALUES(TEST2.COL1, TEST2.COL2, TEST2.COL3);
다음과 같은 문제가 있을 때를 살펴보겠습니다. 위의 문제는 TEST1 테이블에 TEST2 테이블을 MERGE 하는 작업을 수행합니다.
1) A X 1
- 해당 부분은 ON (TEST.COL1 = TEST2.COL1) 조건을 만족하기 때문에 WHEN MATCHED THEN 절을 실행합니다.
- UPDATE 구문의 WHERE 조건은 만족하지 않기 때문에 별도의 변경되는 값은 없습니다.
- DELETE 같은 경우 MERGE 구문에서는 UPDATE가 된 행에 한해서만 DELETE를 수행하기 때문에 실행되지 않습니다.
2) B Y 2
- 해당 부분 역시 WHEN MATCHGED THEN 절을 실행합니다
- UPDATE 구문의 WHERE 조건을 만족하므로 COL3의 값이 4로 변경됩니다.
- 이후 DELETE 구문이 실행되고 조건을 만족하지 않으므로 삭제되지 않습니다.
3) C Z 3
- 해당 부분 역시 WHEN MATCHED THEN 절을 실행합니다.
- UPDATE 구문의 WHERE 조건을 만족하지 않으므로 값 변경이 일어나지 않습니다.
- 마찬가지로 UPDATE 된 행이 아니므로 DELETE 구문이 실행되지 않습니다.
4) D 가 4
- 해당 부분은 WHEN NOT MATCHED THEN 절을 실행합니다.
- 해당 값을 TEST1 테이블에 INSERT 하는 작업을 수행합니다.
5) E 나 5
- 해당 부분 역시 WHEN NOT MATCHED THEN 절을 실행합니다.
- 해당 값을 TEST1 테이블에 INSERT 하는 작업을 수행합니다.
따라서 모든 작업을 수행한 이후 TEST1 테이블의 행을 살펴보면 다음과 같습니다.
[TEST1]
COL1 COL2 COL3
------------------
A X 1
B Y 4
C Z 3
D 가 4
E 나 5
간단하게 ORACLE이 제공하는 MERGE INTO 구문에 대해 살펴보았습니다. SQLD 에서 종종 등장한다고 하니 알아두도록 합시다.