SQLD

[SQLD] MERGE INTO 구문

엥재 2023. 9. 7. 17:56

이번 포스팅에서는 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 에서 종종 등장한다고 하니 알아두도록 합시다.