UPSERT라고 불리는 MERGE는 기본적으로 2개의 테이블을 비교하여 한쪽으로 MERGE하는
기능을 수행한다. 예를 들어
MERGE INTO TEMP_MERGE1 A
USING TEMP_MERGE2 B ON ( A.EMP_NO = B.EMP_NO )
WHEN MATCHED THEN
UPDATE SET A.EMP_NM = B.EMP_NM
WHEN NOT MATCHED THEN
INSERT (EMP_NO, EMP_NM) VALUES ( B.EMP_NO, B.EMP_NM);
위 SQL문은 TEMP_MERGE1에 TEMP_MERGE2.EMP_NO가 있을 경우 TEMP_MERGE1의 EMP_NM을 TEMP_MERGE2.EMP_NM으로
UPDATE 하고, 없을 경우, TEMP_MERGE2의 값을 INSERT하는 문장이다.
그러나, 실제로는 이렇게 두개의 테이블을 사용하는 경우보다는
하나의 테이블에 새로운 데이타를 입력하고자 할 때, 있으면 UPDATE, 없으면 INSERT하려는 경우가
많다는 것이다. 이런 경우는 어떻게 처리하는지 살펴본다.
MERGE INTO TEMP_MERGE1 A
USING (SELECT :empNo, :empNm FROM DUAL) B ON (A.EMP_NO = B.EMP_NO)
WHEN MATCHED THEN
UPDATE SET EMP_NM = B.EMP_NM
WHEN NOT MATCHED THEN
INSERT (EMP_NO, EMP_NM) VALUES ( B.EMP_NO, B.EMP_NM);
위와 같이, 입력하고자 하는 값으로 DUAL을 이용해 가상테이블을 만들어 사용하면
간단히 해결할 수 있다.
기능을 수행한다. 예를 들어
MERGE INTO TEMP_MERGE1 A
USING TEMP_MERGE2 B ON ( A.EMP_NO = B.EMP_NO )
WHEN MATCHED THEN
UPDATE SET A.EMP_NM = B.EMP_NM
WHEN NOT MATCHED THEN
INSERT (EMP_NO, EMP_NM) VALUES ( B.EMP_NO, B.EMP_NM);
위 SQL문은 TEMP_MERGE1에 TEMP_MERGE2.EMP_NO가 있을 경우 TEMP_MERGE1의 EMP_NM을 TEMP_MERGE2.EMP_NM으로
UPDATE 하고, 없을 경우, TEMP_MERGE2의 값을 INSERT하는 문장이다.
그러나, 실제로는 이렇게 두개의 테이블을 사용하는 경우보다는
하나의 테이블에 새로운 데이타를 입력하고자 할 때, 있으면 UPDATE, 없으면 INSERT하려는 경우가
많다는 것이다. 이런 경우는 어떻게 처리하는지 살펴본다.
MERGE INTO TEMP_MERGE1 A
USING (SELECT :empNo, :empNm FROM DUAL) B ON (A.EMP_NO = B.EMP_NO)
WHEN MATCHED THEN
UPDATE SET EMP_NM = B.EMP_NM
WHEN NOT MATCHED THEN
INSERT (EMP_NO, EMP_NM) VALUES ( B.EMP_NO, B.EMP_NM);
위와 같이, 입력하고자 하는 값으로 DUAL을 이용해 가상테이블을 만들어 사용하면
간단히 해결할 수 있다.
'DB' 카테고리의 다른 글
Oracle Instance Client 설치 (0) | 2013.06.12 |
---|---|
oracle table+index size 계산 (0) | 2010.07.23 |
다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (1) [펌] (0) | 2009.12.15 |
필드 정보 가져오기 (0) | 2009.11.19 |
내 쿼리에 Index 고속버스를 꼭 태우자! (Oracle) (0) | 2009.04.09 |