반응형
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 문 사용 시 주의사항
- 키 값 설정
- ON 조건을 명확히 정의하여 잘못된 데이터 병합을 방지하세요.
- 성능 고려
- MERGE 문은 비교 작업이 많으므로 대량의 데이터 병합 시 성능 이슈가 발생할 수 있습니다.
- 트랜잭션 관리
- MERGE는 한 문장에서 여러 작업을 수행하므로 트랜잭션 단위로 관리하세요.
- DELETE 조건 사용 시 주의
- NOT MATCHED BY SOURCE 절을 사용할 때, 실수로 중요한 데이터를 삭제하지 않도록 주의하세요.
5. 결론
MERGE 문은 데이터 병합과 동기화 작업을 간단하게 처리할 수 있는 효율적인 SQL 명령입니다.
Oracle Database에서 데이터를 삽입하고 갱신하며 삭제 작업을 하나의 문장으로 처리하여 개발 생산성을 높이고, 코드의 가독성을 유지할 수 있습니다.
이제 MERGE 문을 활용해 데이터 병합 작업을 효율적으로 처리해 보세요! 😊
반응형
'Database' 카테고리의 다른 글
오라클 PARTITION 테이블의 이해와 활용 (0) | 2024.12.04 |
---|---|
오라클 SQL*Loader로 데이터 대량 삽입하기 (0) | 2024.12.04 |
오라클 AUTONOMOUS TRANSACTION 사용법 (0) | 2024.12.03 |
오라클 SQL 실행 계획 분석하기 EXPLAIN PLAN (0) | 2024.12.03 |
오라클 데이터베이스 성능 튜닝 기초: 쿼리 최적화 (0) | 2024.12.03 |