본문 바로가기
Database

오라클 MERGE로 데이터 병합하기

by 굿센스굿 2024. 12. 3.
반응형


Oracle Database의 MERGE 문은 하나의 SQL 문으로 INSERT, UPDATE, DELETE를 조합하여 데이터 병합을 처리할 수 있는 강력한 기능을 제공합니다.
MERGE 문은 주로 **기존 데이터를 갱신(Update)**하거나 **새로운 데이터를 삽입(Insert)**하는 작업에 사용됩니다.

이 글에서는 MERGE 문의 개념, 사용법, 실무에서 자주 사용되는 예제 3가지를 소개하겠습니다.


1. MERGE 문이란?

MERGE 문은 두 개의 데이터 세트를 비교하여 조건에 따라 데이터 삽입(INSERT), 갱신(UPDATE), 또는 삭제(DELETE) 작업을 수행하는 SQL 문입니다.
주로 다음과 같은 상황에서 사용됩니다.

  • 원본(Source) 데이터와 대상(Target) 데이터를 비교하여 차이를 반영.
  • ETL 프로세스에서 데이터 동기화.
  • 데이터 웨어하우스의 업데이트 로직 구현.

MERGE 문의 구조

기본 문법

MERGE INTO 대상_테이블 USING 소스_테이블
ON (조건)
WHEN MATCHED THEN
    UPDATE SET 대상_컬럼 = 값
WHEN NOT MATCHED THEN
    INSERT (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);

2. MERGE 문 주요 구성 요소

(1) MERGE INTO

  • 데이터를 삽입하거나 갱신할 **대상 테이블(Target)**을 지정합니다.

(2) USING

  • 데이터를 비교할 소스 테이블(Source) 또는 하위 쿼리를 지정합니다.

(3) ON

  • 대상 테이블과 소스 테이블 간의 일치 조건을 정의합니다.

(4) WHEN MATCHED THEN

  • ON 조건이 일치하는 경우 수행할 작업을 지정합니다. 주로 UPDATE 또는 DELETE 작업이 포함됩니다.

(5) WHEN NOT MATCHED THEN

  • ON 조건이 일치하지 않는 경우 수행할 작업을 지정합니다. 주로 INSERT 작업이 포함됩니다.

3. MERGE 문 사용 예제

예제 1: 기본적인 MERGE 활용

요구사항

  • 직원 정보가 저장된 EMPLOYEES 테이블과 신규 데이터가 포함된 EMPLOYEES_UPDATE 테이블이 있습니다.
  • EMPLOYEE_ID가 일치하면 직원 이름(NAME)을 업데이트하고, 일치하지 않는 데이터는 새로 삽입합니다.

테이블 생성 및 데이터 삽입

CREATE TABLE EMPLOYEES (
    EMPLOYEE_ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(100),
    DEPARTMENT_ID NUMBER
);

INSERT INTO EMPLOYEES VALUES (1, 'John Doe', 10);
INSERT INTO EMPLOYEES VALUES (2, 'Jane Smith', 20);

CREATE TABLE EMPLOYEES_UPDATE (
    EMPLOYEE_ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(100),
    DEPARTMENT_ID NUMBER
);

INSERT INTO EMPLOYEES_UPDATE VALUES (1, 'Johnathan Doe', 10);
INSERT INTO EMPLOYEES_UPDATE VALUES (3, 'Alice Brown', 30);

MERGE 문 실행

MERGE INTO EMPLOYEES E
USING EMPLOYEES_UPDATE EU
ON (E.EMPLOYEE_ID = EU.EMPLOYEE_ID)
WHEN MATCHED THEN
    UPDATE SET E.NAME = EU.NAME
WHEN NOT MATCHED THEN
    INSERT (EMPLOYEE_ID, NAME, DEPARTMENT_ID)
    VALUES (EU.EMPLOYEE_ID, EU.NAME, EU.DEPARTMENT_ID);

결과 확인

SELECT * FROM EMPLOYEES;

EMPLOYEE_ID NAME DEPARTMENT_ID

1 Johnathan Doe 10
2 Jane Smith 20
3 Alice Brown 30

예제 2: 삭제 조건 포함한 MERGE

요구사항

  • PRODUCTS 테이블의 데이터를 PRODUCTS_TEMP와 비교합니다.
  • TEMP에 없는 데이터는 PRODUCTS에서 삭제, 일치하는 데이터는 갱신합니다.

테이블 생성 및 데이터 삽입

CREATE TABLE PRODUCTS (
    PRODUCT_ID NUMBER PRIMARY KEY,
    PRODUCT_NAME VARCHAR2(100),
    PRICE NUMBER
);

INSERT INTO PRODUCTS VALUES (1, 'Laptop', 1000);
INSERT INTO PRODUCTS VALUES (2, 'Tablet', 500);
INSERT INTO PRODUCTS VALUES (3, 'Smartphone', 700);

CREATE TABLE PRODUCTS_TEMP (
    PRODUCT_ID NUMBER PRIMARY KEY,
    PRODUCT_NAME VARCHAR2(100),
    PRICE NUMBER
);

INSERT INTO PRODUCTS_TEMP VALUES (1, 'Laptop', 1200);
INSERT INTO PRODUCTS_TEMP VALUES (3, 'Smartphone', 750);

MERGE 문 실행

MERGE INTO PRODUCTS P
USING PRODUCTS_TEMP PT
ON (P.PRODUCT_ID = PT.PRODUCT_ID)
WHEN MATCHED THEN
    UPDATE SET P.PRICE = PT.PRICE
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

결과 확인

SELECT * FROM PRODUCTS;

PRODUCT_ID PRODUCT_NAME PRICE

1 Laptop 1200
3 Smartphone 750

예제 3: 조건부 삽입과 업데이트

요구사항

  • 고객 정보가 저장된 CUSTOMERS 테이블과 신규 정보가 저장된 CUSTOMERS_UPDATE 테이블을 병합합니다.
  • 신규 데이터가 VIP 등급이면 추가로 적립 포인트를 설정합니다.

테이블 생성 및 데이터 삽입

CREATE TABLE CUSTOMERS (
    CUSTOMER_ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(100),
    GRADE VARCHAR2(20),
    POINTS NUMBER
);

INSERT INTO CUSTOMERS VALUES (1, 'Alice', 'Regular', 100);
INSERT INTO CUSTOMERS VALUES (2, 'Bob', 'VIP', 500);

CREATE TABLE CUSTOMERS_UPDATE (
    CUSTOMER_ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(100),
    GRADE VARCHAR2(20)
);

INSERT INTO CUSTOMERS_UPDATE VALUES (1, 'Alice', 'VIP');
INSERT INTO CUSTOMERS_UPDATE VALUES (3, 'Charlie', 'Regular');

MERGE 문 실행

MERGE INTO CUSTOMERS C
USING CUSTOMERS_UPDATE CU
ON (C.CUSTOMER_ID = CU.CUSTOMER_ID)
WHEN MATCHED THEN
    UPDATE SET C.GRADE = CU.GRADE, 
               C.POINTS = CASE WHEN CU.GRADE = 'VIP' THEN C.POINTS + 200 ELSE C.POINTS END
WHEN NOT MATCHED THEN
    INSERT (CUSTOMER_ID, NAME, GRADE, POINTS)
    VALUES (CU.CUSTOMER_ID, CU.NAME, CU.GRADE, CASE WHEN CU.GRADE = 'VIP' THEN 200 ELSE 0 END);

결과 확인

SELECT * FROM CUSTOMERS;

CUSTOMER_ID NAME GRADE POINTS

1 Alice VIP 300
2 Bob VIP 500
3 Charlie Regular 0

4. MERGE 문 사용 시 주의사항

  1. 키 값 설정
    • ON 조건을 명확히 정의하여 잘못된 데이터 병합을 방지하세요.
  2. 성능 고려
    • MERGE 문은 비교 작업이 많으므로 대량의 데이터 병합 시 성능 이슈가 발생할 수 있습니다.
  3. 트랜잭션 관리
    • MERGE는 한 문장에서 여러 작업을 수행하므로 트랜잭션 단위로 관리하세요.
  4. DELETE 조건 사용 시 주의
    • NOT MATCHED BY SOURCE 절을 사용할 때, 실수로 중요한 데이터를 삭제하지 않도록 주의하세요.

5. 결론

MERGE 문은 데이터 병합과 동기화 작업을 간단하게 처리할 수 있는 효율적인 SQL 명령입니다.
Oracle Database에서 데이터를 삽입하고 갱신하며 삭제 작업을 하나의 문장으로 처리하여 개발 생산성을 높이고, 코드의 가독성을 유지할 수 있습니다.

이제 MERGE 문을 활용해 데이터 병합 작업을 효율적으로 처리해 보세요! 😊

반응형