UPDATE와 INSERT를 동시에 처리하고 싶은 경우 MERGE문을 사용하면 원하는 조건에 맞는 행은 UPDATE를, 조건에 맞지 않는 행은 INSERT를 할 수 있습니다. 즉, 이미 존재하는값은 UPDATE, 신규로 입력된 값은 INSERT합니다.
MERGE INTO CUSTOMER C
USING
(
SELECT USERNO
, USERNAME
, ADDRESS
, PHONE
FROM NEW_JOIN
WHERE INPUT_DATE = '20170724'
) N
ON ( C.USERNO = N.USERNO)
WHEN MATCHED THEN
UPDATE
SET C.USERNAME = N.USERNAME
, C.ADDRESS = N.ADDRESS
, C.PHONE = N.PHONE
WHEN NOT MATCHED THEN
INSERT ( USERNO
, USERNAME
, ADDRESS
, PHONE
)
VALUES (
N.USERNO
, N.USERNAME
, N.ADDRESS
, N.PHONE
)
MERGE INTO CUSTOMER C : INSERT 또는 UPDATE 할 테이블과 테이블의 ALIAS 를 지정해줍니다.
USING : 원하는 결과를 추출하기 위한 SELECT 문입니다. 이 SELECT 문에서 나온 결과를 INSERT 또는 UPDATE 할 예정입니다.
ON : SELECT 한 결과와 입력하고 싶은 테이블의 UNIQUE 한 값을 매칭하는 연결고리입니다. ( 주로 KEY 값을 사용 )
WHEN MATCHED THEN : SELECT 의 결과가 INSERT 할 테이블에 값이 이미 존재하는 경우 UPDATE 를 실행합니다.
WHEN NOT MATCHED THEN : SELECT 의 결과가 INSERT 할 테이블에 값이 없는 경우 INSERT 를 실행합니다.
업데이트만 하고 싶다면 WHEN NOT MATCHED THEN 이하의 문장을 제거하면 됩니다.
또한 오라클 10g 이후로는 SELECT 한 결과를 UPDATE뿐만 아니라 DELETE도 처리할 수 있게되었습니다.
MERGE INTO CUSTOMER C
USING
(
SELECT USERNO
, USERNAME
, ADDRESS
, PHONE
FROM NEW_JOIN
WHERE INPUT_DATE = '20170724'
) N
ON ( C.USERNO = N.USERNO)
WHEN MATCHED THEN
UPDATE
SET C.USERNAME = N.USERNAME
, C.ADDRESS = N.ADDRESS
, C.PHONE = N.PHONE
DELETE WHERE SAL >= 3000
MERGE문은 트랜잭션 단위로 실행되기 때문에 COMMIT, ROLLBACK을 처리해야 완전한 반영이 됩니다.
'Oracle' 카테고리의 다른 글
[Oracle] TO_DATE 날짜 변환 (0) | 2019.09.09 |
---|---|
[Oracle] LISTAGG (0) | 2019.08.04 |
[Oracle] 조인 방법 (use_nl, use_hash, use_merge) (0) | 2019.06.24 |
[Oracle] 테이블 조인 튜닝 (ordered, leading) (0) | 2019.06.24 |
[Oracle] 결합알고리즘과 성능 (0) | 2019.06.24 |