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절을 사용하는고싱 있을지 모르지만
그래도 정리해 봅니다.
'개발 > DB' 카테고리의 다른 글
| [oracle Like In 절] 오라클 LIKE를 IN절처럼 사용하는 방법 (IN-LIKE 구현 팁) (4) | 2025.08.10 |
|---|---|
| [Oracle Blob Maping] Cause: java.sql.SQLException: 부적합한 열 유형 (0) | 2025.07.16 |
| 오라클 BETWEEN과 LIKE 스캔 범위를 비교 해보자 (0) | 2022.08.31 |
| 오라클(oracle) 등 DB에서 IN절과 '=' 개념 차이 확인 (0) | 2022.08.30 |
| [oracle] 오라클 view 생성 등 기초 알아보기(view, mview) (0) | 2020.06.10 |
| [oracle] synonym(동의어) 생성 및 삭제 (0) | 2020.06.09 |
| [오라클(oracle)] join update 힌트로 해결 (2) | 2020.03.04 |