프로그램을 만들다 보면 조금은 특별한 경우가 발생합니다.
"테이블에 해당 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의 경우도 마찬가지 입니다.