[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하는 의미이다.






© 2021.11. by 21thkafka

Powered by 21thkafka