개발/DB

[Oracle 문법 merge into] 문법, 예제, 활용도에 대해 기록

Mr.Lee 하루 2025. 7. 9. 08:47

Oracle MERGE INTO 문법 정리

프로젝트를 진행하며 merge into절이 있어
이번기회에 정리해 봅니다.

설명

Oracle의 MERGE INTO 절은 UPSERT (Update or Insert) 작업을 수행할 때 사용됩니다.
즉, 대상 테이블에 해당 데이터가 존재하면 UPDATE, 존재하지 않으면 INSERT 합니다.


✅ 기본 문법

MERGE INTO target_table tgt
USING source_table src
ON (tgt.key_column = src.key_column)
WHEN MATCHED THEN
    UPDATE SET tgt.col1 = src.col1, tgt.col2 = src.col2
WHEN NOT MATCHED THEN
    INSERT (col1, col2, col3)
    VALUES (src.col1, src.col2, src.col3);

-한글 설명
MERGE INTO 대상_테이블 별칭
USING (서브쿼리 또는 소스 테이블) 소스_별칭
ON (조인 조건)
WHEN MATCHED THEN
    UPDATE SET 컬럼 = 값
WHEN NOT MATCHED THEN
    INSERT (컬럼1, 컬럼2, ...)
    VALUES (값1, 값2, ...);

✅ 예제

MERGE INTO employees e
USING new_employees n
ON (e.emp_id = n.emp_id)
WHEN MATCHED THEN
    UPDATE SET e.name = n.name, e.salary = n.salary
WHEN NOT MATCHED THEN
    INSERT (emp_id, name, salary)
    VALUES (n.emp_id, n.name, n.salary);
  • emp_id가 일치하면 → 기존 name, salary업데이트
  • emp_id가 없으면 → 새 레코드 삽입

MERGE INTO customer c
USING (SELECT 101 AS id, '홍길동' AS name FROM dual) s
ON (c.id = s.id)
WHEN MATCHED THEN
    UPDATE SET c.name = s.name
WHEN NOT MATCHED THEN
    INSERT (id, name)
    VALUES (s.id, s.name);
  • ID가 101인 고객이 존재하면 이름을 업데이트, 존재하지 않으면 새로 삽입

MERGE INTO orders o
USING new_orders n
ON (o.order_id = n.order_id)
WHEN MATCHED THEN
    UPDATE SET o.status = n.status
    WHERE o.status != 'CANCELLED'
WHEN NOT MATCHED THEN
    INSERT (order_id, customer_id, status)
    VALUES (n.order_id, n.customer_id, n.status);

⚠️ 주의 사항

  • ON 절은 조인 조건처럼 정확하게 작성되어야 함 (예제 3개를 잘 확인하세요)
  • WHEN MATCHED, WHEN NOT MATCHED 절은 선택적으로 작성 가능
  • 다량의 데이터에 대해 업데이트/삽입을 한번에 처리할 수 있어 효율적

✅ Merge INTO의 활용 사례

  • 배치 처리 중 UPSERT 로직 구현
  • 데이터 마이그레이션
  • 외부 시스템 데이터 동기화
  • ETL 프로세스 내 병합 처리

필자는 너무 구식 프로젝트를 운영해서...아직도 merge into절을 사용하는고싱 있을지 모르지만
그래도 정리해 봅니다.