[SQL] Oracle DML 심화 정리 - MERGE 테이블 병합과 INSERT ALL / INSERT FIRST 다중 삽입
by 우와한개발자
1. MERGE : 테이블 병합
- 두 테이블을 하나로 병합
- 조건에 따라 UPDATE 또는 INSERT 수행
MERGE INTO 대상테이블 t
USING 소스테이블 s
ON (조건)
WHEN MATCHED THEN
UPDATE SET 컬럼 = 값
WHEN NOT MATCHED THEN
INSERT (컬럼들)
VALUES (값들);
| 구분 | 의미 | 비고 |
| 대상테이블 (TARGET) | 실제 변경되는 테이블 | 테이블 바뀜 |
| 소스테이블 (SOURCE) | 비교 기준 데이터 | 테이블 안 바뀜 |
| ON 조건 | 매칭 기준 | JOIN 조건과 유사 |
| WHEN MATCHED THEN UPDATE SET 컬럼 = 값 |
조건 만족 시 | UPDATE |
| WHEN NOT MATCHED THEN INSERT (컬럼들) VALUES (값들); |
조건 불만족 시 | INSERT |
MERGE INTO emp t
USING emp_temp s
ON (t.empno = s.empno)
WHEN MATCHED THEN
UPDATE SET t.salary = s.salary
WHEN NOT MATCHED THEN
INSERT (empno, ename, salary)
VALUES (s.empno, s.ename, s.salary);
MERGE INTO emp t
USING (
SELECT empno, ename, salary
FROM emp_temp
) s
ON (t.empno = s.empno)
WHEN MATCHED THEN
UPDATE SET t.salary = s.salary
WHEN NOT MATCHED THEN
INSERT (empno, ename, salary)
VALUES (s.empno, s.ename, s.salary);
1) JOIN과 MERGE 비교
| 구분 | JOIN | MERGE |
| 목적 | 조회 (읽기) | 데이터 변경 (쓰기) |
| 결과 | 결과셋 반환 | 테이블 직접 변경 |
| 위치 | SELECT | DML |
| 매칭 시 | 데이터 결합 | UPDATE |
| 비매칭 시 | NULL 또는 제외 | INSERT |
| 개념 | 읽기 | 동기화 (UPSERT) |
2. Multiple INSERT : 테이블 분리
1) INSERT FIRST
- 조건을 위에서부터 검사해서 처음 만족한 것만 INSERT
INSERT FIRST
WHEN 조건1 THEN INTO 테이블1 VALUES (...)
WHEN 조건2 THEN INTO 테이블2 VALUES (...)
ELSE INTO 테이블3 VALUES (...)
SELECT 컬럼들
FROM 소스;
2) INSERT ALL
- 조건을 검사해서 맞는 모든 INTO 실행 (여러 테이블에 INSERT 가능)
INSERT ALL
[WHEN 조건1 THEN ]
INTO 테이블1 VALUES (...)
[WHEN 조건2 THEN ]
INTO 테이블2 VALUES (...)
[WHEN 조건3 THEN ]
INTO 테이블3 VALUES (...)
SELECT 컬럼들
FROM 소스;
| 구분 | INSERT FIRST | INSERT ALL |
| 조건 만족 | 하나만 실행 | 전부 실행 |
| 흐름 | if-else | if 여러 개 |
| 결과 | 한 테이블만 | 여러 테이블 가능 |
'데이터베이스 > SQL' 카테고리의 다른 글
블로그의 정보
우와한개발자 님의 블로그
우와한개발자