[Oracle] MERGE INTO 사용법 데이터가 있으면 UPDATE 없으면 INSERT

MERGE문은 테이블에 원하는 데이터가 있으면 그 데이터를 UPDATE하고 없으면 INSERT하는 구문입니다. 이 문법 PK중복 문제 해결등 각종 문제 해결에 정말 유용하게 사용되는 문법입니다.

 

MERGE문 사용법

MERGE INTO 테이블명
USING 타겟 테이블
ON 타겟 데이터
WHEN MATCHED THEN
SET 
컬럼1 = 값1,
컬럼2 = 값2,
...
WHERE 조건
WHEN NOT MATCHED THEN
INSERT (컬럼1, 컬럼2 ...) VALUES (값1, 값2...)
WHERE 조건;

MERGE문의 기본 사용법은 위와 같습니다. 다른 DML보다 문법이 복잡한편이라 처음 접하면 사용하기 힘들수도 있다 생각됩니다. 이에 아래 간단한 예제를 준비했습니다.

 

 MERGE문 예제 

테스트 테이블 생성

CREATE TABLE TEST_TABLE (
    COMPANY_CODE  VARCHAR2(10) NOT NULL,--회사코드
    COMPANY_NAME VARCHAR2(50) NOT NULL --회사이름
);

MERGE문을 실습하기 위해 간단한 테이블 하나를 생성했습니다. 테이블은 COMPANY_CODE(회사코드)와 COMPANY_NAME(회사이름)으로 이루어져있으며 테이블에 COMPANY_CODE가 '1' 이라는 데이터가 있으면 UPDATE 없으면 INSERT를 해보는 식으로 MERGE문을 만들어보도록 하겠습니다.

 

MERGE문 실행

MERGE INTO TEST_TABLE
USING DUAL
   ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
    UPDATE SET COMPANY_NAME = '삼성전자'
WHEN NOT MATCHED THEN
    INSERT (COMPANY_CODE, COMPANY_NAME) 
    VALUES ('1','현대자동차');

MERGE문 예제1

위 쿼리를 한번 실행시키면 현대자동차라는 회사명의 데이터가 INSERT됩니다. 아무것도 없는 테이블에 타겟으로 한 COMPANY_CODE = '1' 이라는 데이터가 없으므로 INSERT문이 실행된것입니다. 그렇다면 이제 COMPANY_CODE = 1이라는 데이터가 있으니 이 쿼리를 한번 더 실행시키면 어떻게 될까요? 

MERGE문 예제2

COMPANY_CODE = '1' 이라는 데이터가 있으므로 UPDATE문이 실행되어 COMPANY_NAME이 현대차에서 삼성전자로 UPDATE됩니다.

 

UPDATE문 / INSERT문 중 하나만 실행

--데이터가 없을경우에 INSERT
MERGE INTO TEST_TABLE 
USING DUAL
   ON (COMPANY_CODE = '1')
WHEN NOT MATCHED THEN
    INSERT (COMPANY_CODE, COMPANY_NAME) 
    VALUES ('1','현대자동차');

--데이터가 있을 경우 UPDATE
MERGE INTO TEST_TABLE 
USING DUAL
   ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
    UPDATE SET COMPANY_NAME = '삼성전자'

위와같이 UPDATE와 INSERT를 하나씩만 실행시켜 EXISTS를 쓰는것과 비슷한 느낌으로 사용할수도 있습니다.

 

데이터가 있을 경우 DELETE 없을 경우 INSERT

MERGE INTO TEST_TABLE
USING DUAL
   ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
    UPDATE SET COMPANY_NAME = '삼성전자'
    DELETE WHERE COMPANY_CODE = '1'
WHEN NOT MATCHED THEN
    INSERT (COMPANY_CODE, COMPANY_NAME) 
    VALUES ('1','현대자동차');

UPDATE절에 DELETE문을 추가할 수도 있습니다. 이 방법은 UPDATE될 값을 평가해서 조건에 맞는 데이터를 삭제하는 역할을 합니다. 주로 위와 같이 데이터가 있을 경우 DELETE 없을 경우 INSERT로 사용됩니다.

 

데이터 이관

MERGE INTO TEST_TABLE A
USING EX_TABLE B
ON (A.COMPANY_CODE = B.COMPANY_CODE)
WHEN MATCHED THEN
     UPDATE SET
     A.COMPANY_NAME = B.COMPANY_NAME
WHEN NOT MATCHED THEN
     INSERT (A.COMPANY_CODE,A.COMPANY_NAME) 
     VALUES (B.COMPANY_CODE,B.COMPANY_NAME);

MERGE문은 다양하게 활용됩니다. 테이블끼리 데이터를 이관할때도 유용하게 사용됩니다. 위 예제는 EX_TABLE에있는 데이터를 TEST_TABLE 테이블로 데이터를 이관하는 예제입니다.

댓글

Designed by JB FACTORY