query:merge

BOX/memorize 2009. 2. 4. 09:49 posted by semanticker

프로그램을 만들다 보면 조금은 특별한 경우가 발생합니다.
"테이블에 해당 ROW가 존재할  경우 UPDATE 하고,
 아니면 INSERT 하라."

가장 기본적인 방법은 해당 row를 UPDATE 하고 결과의 갯수가 0 이라면 INSERT를 하는 방법입니다.

int resultCont = targetDAO.update();

if(resultCount == 0)
{
      targetDAO.input();
}

이 외에도 DB에서 해결하는 방법으로 프로시저를 만드는등 방법이 있겠지만 기본적인 맥락은 동일하다고 할수 있겠습니다.

하지만 오라클에서 merge 쿼리로 위와 같은 방법을 지원합니다.

MERGE INTO TABLE1 t1
USING (
           SELECT  col1   AS col1
                        ,col2   AS col2
           FROM    TABEL2
      )t2
ON ( t1.col1 = t2.col1 )
WHEN MATCHED THEN
         UPDATE SET  t1.col1 = t2.col1
                            ,t1.col2 = t2.col2
WHEN NOT MATCHED THEN
    INSERT( t1.col1
                ,t1.col2
      ) VALUES(  t2.col1
                      ,t2.col2
      )

여기에서는 현재 TABLE1과 TABLE2로 나누어서 진행하지만 그 대상이 같을 경우

MERGE INTO TABLE1 t1
USING (
           SELECT  col1   AS col1
                        ,col2   AS col2
           FROM    DUAL
     )t2
ON ( t1.col1 = t2.col1 AND t1.col1 = t2.col2)
WHEN MATCHED THEN
         UPDATE SET  t1.col1 = 'value'
WHEN NOT MATCHED THEN
    INSERT( t1.col1
                ,t1.col2
      ) VALUES( 'value1', 'value2')

과 같이 진행할수도 있습니다.

  • ON 다음에 조건이 여러개가 될수있다는점
  • t2의 대상이 되는 테이블이 특정 고정값을 위해서 dual에서 쿼리한다는점
  • matched 되었을때 특정값으로 변경할수 있다는점을 유의합니다.
  • t2의 검색된 값을 입력할수도 있고 특정값을 입력할수도 있습니다.


not matched의 경우도 마찬가지 입니다.