해당하는 레코드가 있는지 여부에 따라, 조건부로 테이블의 레코드를 삽입 • 업데이트 또는 삭제할 수 있다.
UPDATE
INSERT
DELETE
생각한 해법
UPDATE
실행DELETE
실행1번
조건을 만족하지 않으면 특정 레코드를 목표 테이블에 INSERT
기본적으로, EMP_COMMISSION의 사원이 EMP 테이블에 존재하는지 여부를 검사하는 것이 첫 번째 조건이 되겠다.
테이블 생성 및 레코드 입력 / 확인
/* Oracle */
create table emp_commission(
deptno number,
empno number,
ename varchar(20),
comm number
);
insert into emp_commission (deptno, empno, ename)
values (10, 7782, 'CLARK');
insert into emp_commission (deptno, empno, ename)
values (10, 7839, 'KING');
insert into emp_commission (deptno, empno, ename)
values (10, 7934, 'MILLER');
select * from emp_commission;
>>
DEPTNO EMPNO ENAME COMM
10 7839 KING -
10 7934 MILLER -
10 7782 CLARK -
3 rows selected.
MERGE
문을 사용한다필요할 때 UPDATE
또는 INSERT
를 수행할 수 있다.
사용 방법은 아래와 같다.
/* Oracle */
merge into emp_commission ec
using (select * from emp) emp
on (ec.empno = emp.empno)
when matched then
update set ec.comm = 1000
delete where (sal < 2000)
when not matched then
insert (ec.empno, ec.ename, ec.deptno, ec.comm)
values (emp.empno, emp.ename, emp.deptno, emp.comm)
Oracle에서 쿼리를 작성하다보면, 하나의 쿼리로 INSERT
, UPDATE
, DELETE
작업을 해야 하는 경우가 있다.
merge into tb_A /* tb_A 테이블에 */
using tb_B /* 아래 조건을 만족하는 tb_B 테이블의 특정 레코드가 존재한다면 */
on tb_A.record = tb_B.record /* 조건 */
when matched then /* 존재한다 */
update set ?.record = target /* 원하는 UPDATE문 실행 */
delete where ?.record /* 원하는 DELETE문 실행 */
when not matched then /* 존재하지 않는다 */
insert (cols ...) /* 원하는 INSERT문 실행 */
values (values...)
이런 식으로 사용한다.
조건 만족 불만족에 따라 원하는 CUD 작업을 수행할 수 있게 해준다.
MARIA(MySQL)에서는 MERGE
를 지원하지 않는다.
빌트인 중심의 풀이가 나왔다.
MARIA에서 안 되는 것이 생각보다 많다 할 수 있지만, 단일 쿼리가 아니라면 MARIA로도 충분히 해결이 가능하다.
... 단일 쿼리라도 길게 쓴다면 해법이 있을 수 있겠다.
Oracle에서는 함수 중심의 해법이 강한 것 같다.
-> 해법 생각해보기