ORACLE SQL MERGE 명령어
테이블 데이터를 병합하기 위한 명령어 입니다.
실무에서 자주 사용되며 병합되는 테이블에 데이터가 있는 경우에는 UPDATE, 없는 경우에 INSERT등의 로직을 구현할 수 있습니다.
[기본 형식]
MERGE INTO table_name alias USING [table_name | view | subquery] alias ON (조인 조건) WHEN MATCHED THEN UPDATE SET col1 = val1 [,col2 = val2…] WHEN NOT MATCHED THEN INSERT (column_list) VALUES (value_list) |
- MERGE INTO 구 : 데이터가 update 되거나 insert될 테이블명(병합되는 테이블명)
- USING 구 : 머지되는 대상 테이블의 data와 비교한 후 update 또는 insert할 때 사용할 데이터 원본
- ON 구 : update나 insert를 하게 될때의 조건, 조건을 만족하는 레코드가 있으면 WHEN MATCHED 이하를 실행하고 없으면 WHEN NOT MATCHED 이하를 실행 합니다.
- WHEN MATCHED : ON 조건이 참인 경우 수행할 내용
- WHEN NOT MATCHED : ON 조건이 거짓인 경우 수행할 내용
실습을 위해 서브쿼리로 emp_20 이라는 이름으로 테이블을 생성 합니다. EMP 테이블에서 20번 부서원들을 SELECT하여 생성 합니다. |
CREATE TABLE emp_20 AS SELECT empno, ename, sal, deptno FROM emp WHERE deptno = 20 |
<실행결과>
Table EMP_20이(가) 생성되었습니다.
SELECT * FROM emp_20 |
<실행결과>
EMPNO | ENAME | SAL | DEPTNO | |
1 | 7566 | JONES | 2975 | 20 |
2 | 7788 | SCOTT | 3000 | 20 |
3 | 7876 | ADAMS | 1100 | 20 |
4 | 7902 | FORD | 3000 | 20 |
EMP 테이블의 데이터를 원본으로 EMP_20 테이블에 데이터가 이미 있으면 sal 값을 10% 증가, 없으면 INSERT 하는 MERGE 문을 작성 하세요 |
MERGE INTO emp_20 e20 USING emp E ON(e20.empno = E.empno) WHEN MATCHED THEN UPDATE SET e20.sal = E.sal*1.1 WHEN NOT MATCHED THEN INSERT (empno, ename, sal) VALUES (E.empno, E.ename, E.sal) |
<실행결과>
7개 행 이(가) 병합되었습니다.
SELECT * FROM emp_20 |
<실행결과>
EMPNO | ENAME | SAL | DEPTNO | |
1 | 7566 | JONES | 3272.5 | 20 |
2 | 7788 | SCOTT | 3300 | 20 |
3 | 7876 | ADAMS | 1210 | 20 |
4 | 7902 | FORD | 3300 | 20 |
5 | 7782 | CLARK | 2450 | 10 |
6 | 7839 | KING | 5000 | (null) |
7 | 7934 | MILLER | 1300 | 10 |
#MERGE, #SQLMERGE, #오라클MERGE, #ORACLE, #오라클