[Database] merge
merge
merge문을 연습하기 위해 테이블을 만들어보자.
create table material_stock(
mid number primary key
, mname varchar(50)
, mqty number
);
여기에 insert로 데이터도 넣어준다.
insert into material_stock (mid, mname, mqty) values(1, '철광석', 10);
insert into material_stock (mid, mname, mqty) values(2, '석탄', 10);
insert into material_stock (mid, mname, mqty) values(3, '전기', 10);
insert into material_stock (mid, mname, mqty) values(4, '코크스', 10);
insert into material_stock (mid, mname, mqty) values(5, '물', 10);
그리고 또 다른 테이블을 생성한다. 이 테이블은 수시로 데이터가 변하는 테이블이라고 가정해보자.
create table material_stock_input (
mid number primary key
, mname varchar(50)
, mqty number
);
이 테이블에 맞춰 마찬가지로 데이터를 insert 한다.
insert into material_stock_input(mid, mname, mqty) values(1, '철광석', 50);
insert into material_stock_input(mid, mname, mqty) values(6, '니켈', 30);
첫번째 테이블과 두번째 테이블에 공통적인 데이터 철광석이 있지만 서로 수량은 다르다. 그리고 두번째 테이블에 첫번째 테이블에 없는 니켈 데이터가 있다. 이 두 데이터를 첫번째 테이블에 두번째 테이블의 데이터 철광석을 update하고 니켈을 insert하는 방법은 없을까? 이때 merge를 사용하는 것이다.
merge into material_stock org
using(
select mid
, mname
, mqty
from material_stock_input
) chng
on (org.mid = chng.mid)
when matched then
update
set org.mqty = chng.mqty
when not matched then
insert (mid, mname, mqty)
values (chng.mid, chng.mname, chng.mqty);
merge 다음 수정할 테이블 이름을 넣고 using 다음 괄호 안에 사용할 데이터가 있는 테이블, 또는 select 문을 넣는다. 여기서는 수시로 데이터가 변하는 material_stock_input 테이블을 넣었다. 그리고 이 후 명령문은 mid 값이 일치하면 수량을 update하고 일치하지 않으면 insert하는 의미이다.
