2월 07, 2024

SQL merge 문 한방에 이해하기

 SQL에는 insert 문과 update문이 있다. Insert문과 Update문을 결합한 문법 또한 존재하는데 바로 MERGE문이다. 

 

Merge는 Insert와 Update 명령을 결합한 것으로 merge문 하나를 사용하면 update문을 여러 번 사용하지 않아도 된다는 장점이 있다. 따라서 문법만 정확히 알고 있다면 굉장히 편한 것이 merge 문이다. 

 

/*merge문 기본 골격*/

MERGE INTO TABLE_NAME ALIAS
USING TABLE/VIEW/SUBQUERY ALIAS
ON (JOIN CONDITION) --테이블 수정, 입력여부 결정조건
WHEN MATCHED THEN --일치하였을 경우
	UPDATE SET col1=col1_p, col2=col2_p
WHEN NOT MATCHED THEN --일치하지 않았을 경우
	INSERT (LIST to be inserted) 
    VALUES (values) ;

 

이런식으로 merge 문은 match되었을 경우와 match되지 않았을 경우로 나누어서 문법이 구성된다.

ON절의 조건에 따라서 테이블의 update, insert 여부가 결정이 된다. 

 

위와 같이 기본 골격을 보면 헷갈릴 수 있는데, 오히려 간단한 예시를 보면 이해하기가 쉬울 것이다.

 

사원정보를 담은 두 가지 테이블이 있다고 가정해보자.

EMP1과 EMP2라는 테이블이 있는데, 이 중 EMP1 테이블에는 누락된 칼럼 정보가 있을 수 있는 반면, EMP2 테이블에는 사원 정보 자체가 누락되어있을 수 있다.

예를 들어 EMP1 테이블에는 사원 A에 관한 열은 존재하나 월급 같은 column 에 해당되는 정보가 누락되어 있고 해당 정보는 EMP2 테이블에 존재한다. 반면 EMP2 테이블에는 신규 사원 같은 직원들의 정보가 아예 누락되어 있는 경우이다.

 

원래 같았다면 EMP2 테이블을 참고하여 EMP1 테이블을 업데이트하여야 하고, EMP2 테이블에 누락되어 있는 것들을 insert 해야 하는 경우인데 이 프로세스를 merge문을 사용하여 한 번에 해결할 수 있다. 

 

/*MERGE문 사용예제*/

MERGE INTO EMP2 T2
USING EMP1 T1
ON (T1.emp_no = T2.EMP_NO) -- JOIN 조건 : 사번 
WHEN MATCHED THEN
	UPDATE SET T1.sal=T2.sal --사번이 일치할 경우 EMP1 테이블에 salary 정보 update
WHEN NOT MATCHED THEN --일치하지 않을 경우 T2 테이블 insert
	INSERT (EMP_NO, EMP_NM, SAL)
    	VALUES (T1.EMP_NO, T1.EMP_NM, T1.SAL);

 

이런식으로 간편하게 해결할 수 있다.

경우에 따라서는 WHEN MATCHED THEN / WHEN NOT MATCHED THEN 중에서 하나만 사용하여도 무방하다. 

 

MERGE문은 데이터 웨어하우징 응용프로그램에 적합하며, 편리하다는 장점이 있다. 

JOIN 조건에서 key값이 아닌 다른 조건을 사용하면 중복데이터가 발생할 수도 있으니 JOIN 조건을 신중히 결정하면 될 듯하다.

 

MERGE문은 간편하지만 UPDATE나 INSERT 문에 의해 덜 직관적이라는 단점은 존재한다. 하지만 문법을 익히면 매우 편리한 SQL 기능이므로 알아두자.