2014년 4월 16일 수요일

MERGE INTO 로 데이터 INSERT & UPDATE 처리.

MERGE INTO 는 두개의 테이블을 동기화 하는데 사용된다.
쉽게 말해 특정 테이블을 기준으로 동일한 값이 없으면 Insert 를, 동일한 값이 있으면 Update 를 수행한다.

이 특징을 이용해 데이터 등록 쿼리를 간단하게 할 수있다.

예를 들어, 특정값을 등록할 때 기존에 데이터가 등록되어 있으면 Update 를 없으면 Insert 를 해야 할 경우가 있다.

이 경우 일반적으로

select count(*) from Table01 where id = '{0}'

으로 조회 해서 데이터가 있으면 Update. 없으면 Insert 쿼리를 실행하도록 프로그램을 짜는데, 리퀘스트를 던지고 결과값을 받아서 if 문으로 체크하고, 다시 쿼리를 날리는것이 귀찮기도 하거니와 DB Connection 이 두번이나 발생하는게 별로 맘에 안들기도 하다.
바로 이경우 MERGE INTO 를 이용하면 쉽게 해결할 수 있다.

MERGE INTO  Table01
      USING DUAL
ON (id = '{0}')
WHEN MATCHED THEN
   update set
      data01 = '{1}'
     ,data02 = '{2}'
     ,data03 = '{3}'
WHEN NOT MATCHED THEN
   insert (id, data01, data02, data03)
   values ('{0}', '{1}', '{2}', '{3}')


일반적으로 쓰는 MERGE INTO 하고 다른 점은 비교 대상 테이블이 Dual 이라서, 비교 테이블은 아무런 역할도 하지 않으며, 원본 테이블에다 파라메터 값으로 비교한다는것 뿐이다.
즉, 던진 파라메터 값이 원본 테이블에 있는지를 체크하고 insert 하거나 Update 를 수행하게 된다.

참고로 MS-SQL 에서는 Dual 대신 아무 테이블을 쓰거나(존재하기만 하면 됨),

MERGE  Table01
      USING (select 'X' as DUAL)
.
.
.
 (예제)
MERGE RuleInfo USING (select 'X' as DUAL) AS B
ON strCodeId = '111'
WHEN MATCHED THEN
   update set
      strCodeValue = '한글'
WHEN NOT MATCHED THEN
   insert (strCodeId, strCodeValue)
   values ('111', '한글');



이렇게 쓰면 된다.
단. 마지막에 세미콜론(;)을 붙이는것을 잊으면 안된다.