참고 : http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9016.htm
테이블에서 어느 조건을 만족하는 데이터(행)가 있다면 Update 없으면 Insert 하는 구문을 한번에 해결 할 수 있다.
Merge Into 사용전 방법 :
레코드 존재유무 조회(Select) -> 있음 -> Update
-> 없음 -> Delete
샘플.
MERGE INTO bonuses D USING (SELECT employee_id, salary, department_id FROM employees WHERE department_id = 80) S ON (D.employee_id = S.employee_id) WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01 DELETE WHERE (S.salary > 8000) WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus) VALUES (S.employee_id, S.salary*.01) WHERE (S.salary <= 8000); |
MERGE INTO 테이블(뷰) : 대상 테이블(뷰). Update, Delete, Insert 를 하게 될 테이블(뷰)
USING 테이블(뷰/서브쿼리) : 비교 테이블(뷰/서브쿼리).
ON : 비교 조건
WHEN MATCHED THEN UPDATE [DELETE] : 비교조건에 만족하는 레코드가 있을 경우 해당 레코드에 대해 실행
10G부터는 DELETE도 포함되었으며 UPDATE문 없이 단독으로 사용하지 못한다.
WHEN NOT MATCHED THEN INSERT : 비교조건에 만족하지 않았을 경우 실행