ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle - MERGE INTO
    Database/Oracle 2022. 4. 26. 11:37

    MERGE INTO

    MERGE 문이란?

    MERGE 문은 테이블에 원하는 데이터가 있으면, 그 데이터를 UPDATE 하고 없으면 INSERT 하는 구문이다. 이러한 MERGE 문을 사용해서 PK 중복 문제 해결 등 다양한 문제를 해결할 수 있다.

     

    MERGE 문의 사용법
    MERGE INTO 테이블명
    USING 타겟 테이블
    ON 타겟 데이터
    WHEN MATHCED THEN
    SET
    칼럼01 = 값01,
    칼럼02 = 값02,
    ...
    WHERE 조건
    WHEN NOT MATHCED THEN
    INSERT (칼럼01, 칼럼02, ...) VALUES (값01, 값02, ...)
    WHERE 조건;

    MERGE 문의 사용법은 위와 같다. 다른 DML 보다 문법이 복잡한 편이기 때문에, 처음 접하게 되면 사용하기 힘들다. 아래 예제를 통해 자세히 알아보겠다.

     

    MERGE 문의 예제

    1. 테스트 테이블 생성

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

    MERGE 문을 실습하기 위해 간단한 테이블 하나를 생성했다. 테이블은 COMPANY_CODE(회사 코드), COMPANY_NAME(회사 이름)으로 이루어져 있다.

     

    2. 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', '현대자동차');

    테이블에 COMPANY_CODE(회사 코드)가 '1'이라는 데이터가 있으면 UPDATE, 없으면 INSEET 문을 실행하는 쿼리문이다.

     

     

    위 쿼리를 처음 실행시키면 '현대자동차'라는 회사명의 데이터가 INSERT 된다. 테이블에는 COMPANY_CODE(회사 코드)가 '1'인 데이터가 없기 때문에 INSERT 문이 실행된 것이다.

     

    이후, COMPANY_CODE(회사 코드)가 '1'인 데이터가 있는 상태에서 위 쿼리를 실행시켜보겠다.

     

     

    COMPANY_CODE(회사 코드)가 '1'이라는 데이터가 있기 때문에, UPDATE 문이 실행되어 COMPANY_NAME(회사 이름)이 '현대자동차'에서 '삼성전자'로 바뀌게 된다.

     

    MERGE 문의 활용

    1. INSERT 문 / UPDATE 문 중 하나만 실행

    -- 데이터가 없을 경우 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 MATHCED THEN
    	UPDATE SET COMPANY_NAME = '삼성전자'

    위 쿼리문과 같이 UPDATE 문과 INSERT 문을 하나씩만 실행시켜 사용할 수도 있다.

     

    2. 데이터가 있을 경우 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 될 값을 평가해서 조건에 맞는 데이터를 삭제하는 작업을 수행한다. 

     

    3. 데이터 이관

    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 테이블로 이관하는 작업을 수행한다.


    출처

    https://coding-factory.tistory.com/427

     

    728x90

    'Database > Oracle' 카테고리의 다른 글

    Oracle - BETWEEN AND  (0) 2022.05.02
    Oracle - 조건문(IF, CASE)  (0) 2022.04.27
    Oracle - 반복문(LOOP, WHILE, FOR)  (0) 2022.04.25
    Oracle - 변수 및 상수 선언  (0) 2022.04.25
    Oracle - MySQL의 LIMIT & Oracle의 ROWNUM  (0) 2022.04.04

    댓글

Designed by Tistory.