ssseung 2021. 5. 20. 19:20

MERGE 문을 사용하면 새로운 행을 입력하더나, 기존 행을 수정하는 작업을 한 번에 할 수 있다.

 

MERGE 
    INTO 타켓 테이블명
    USING 소스 테이블명
    ON 조인 조건식
WHERE MATCHED THEN
    UPDATE
    	SET 수정할 컬럼 = 수정할 값
WHEN NOT MATCHED THEN
    INSERT [(컬럼1,컬럼2..)]
    	VALUES (값1,값2...);
        

 

TEAM_TMP 테이블을 이용해 TEAM 테이블에 정보를 수정/입력한다.

MERGE
    INTO TEAM T
    USING TEAM_TMP S
    ON (T.TEAM_ID = S.TEAM_ID)
WHEN MATCHED THEN
	UPDATE 
    	SET T.TEAM_ID= S.TEAM_ID
        ,T.TEAM_NAME = S.TEAM_NAME
        ,T.REGION_NAME = S.REGION_NAME        
        ,T.DDD
        ,T.TEL
WHEN NOT MATCHED THEN        
	INSERT (T.TEAM_ID,T.REGION_NAME,T.TEAM_NAME,T.STADIUM_ID,T.DDD,T.TEL)
	VALUES (S.TEAM_ID,S.REGION_NAME,S.TEAM_NAME,S.STADIUM_ID,S.DDD,S.TEL);

USING 절에 서브쿼리를 사용할 수도 있다.

MERGE
    INTO TEAM T
    USING (SELECT * FROM TEAM_TMP WHERE REGION_NAME IN ('성남','부산','대구','전주')) S
    ON (T.TEAM_ID = S.TEAM_ID)
WHEN MATCHED THEN
	UPDATE 
    	SET T.TEAM_ID= S.TEAM_ID
        ,T.TEAM_NAME = S.TEAM_NAME
        ,T.REGION_NAME = S.REGION_NAME        
        ,T.DDD
        ,T.TEL
WHEN NOT MATCHED THEN        
	INSERT (T.TEAM_ID,T.REGION_NAME,T.TEAM_NAME,T.STADIUM_ID,T.DDD,T.TEL)
	VALUES (S.TEAM_ID,S.REGION_NAME,S.TEAM_NAME,S.STADIUM_ID,S.DDD,S.TEL);

 

최신버전의 ORACLE 과 SQL SERVER 에서는 WHEN MATCHED 절과 WHEN NOT MATCHED 절을 선택적으로 사용할 수도 있다. 

MERGE
    INTO TEAM T
    USING (SELECT * FROM TEAM_TMP WHERE REGION_NAME IN ('성남','부산','대구','전주')) S
    ON (T.TEAM_ID = S.TEAM_ID)
WHEN MATCHED THEN
	UPDATE 
    	SET T.TEAM_ID= S.TEAM_ID
        ,T.TEAM_NAME = S.TEAM_NAME
        ,T.REGION_NAME = S.REGION_NAME        
        ,T.DDD
        ,T.TEL;

출처

SQL 전문가 가이드 - 한국데이터산업진흥원

반응형