보통 데이터를 처리할때 데이터의 존재 여부를 확인(SELECT)하고 해당 값이 없으면 삽입(INSERT)하고 있으면 업데이트(UPDATE)를 하게 된다.
이렇게 되면 데이터를 확인하는 쿼리, 데이터를 삽입 하는 쿼리, 데이터를 업데이트 하는 쿼리
3개의 쿼리를 작성해줘야합니다.
오라클에서는 이러한 처리를 한번에 가능 할 수 있습니다 !
바로 MERGE INTO 를 사용하는 것입니다
오라클 9i 버전부터 MEGER 문을 사용할 수 있으며, DELETE를 사용하는 MERGE 문은 10g 버전부터 사용할 수 있다.
사용 문법
MERGE INTO [TABLE / VIEW] -- update 또는 insert할 테이블 혹은 뷰
USING [TABLE / VIEW / DUAL] -- 비교할 대상 테이블 혹은 뷰 (위 테이블과 동일할 경우 DUAL을 사용)
ON [조건] -- UPDATE 와 INSERT 처리할 조건문 (조건이 일치하면 UPDATE / 불일치 시 INSERT)
WHEN MATCHED THEN -- 일치하는 경우
UPDATE SET
[COLUMN1] = [VALUE1],
[COLUMN2] = [VALUE2],
...
(DELETE [TABLE] WHERE [COLUMN 1] = [VALUE 1] AND ...) -- UPDATE 뿐만 아니라 DELETE 구문도 사용 가능
WHEN NOT MATCHED THEN -- 일치하지 않는 경우
INSERT (COLUMN1, COLUMN2, ...)
VALUES (VALUE1, VALUE2, ...)
사용 방법
1. 서로 다은 테이블 비교후 MERGE INTO
보통의 순서가 update나 insert할 테이블을 지정하고 using 뒤에 비교할 테이블 ON 뒤에는 조건을 적어준다.
조건이 맞으면 WHEN MATCHED THEN 아래에 맞는 경우에 대해 쿼리문을 작성하고
조건이 맞지 않으면 WHEN NOT MATCHED THEN 아래에는 맞지 않는 경우에 대해 쿼리문을 작성한다.
조건후에 오는 쿼리문은 일반적인 UPDATE, INSERT문은 일반적인 INSERT, UPDATE 문을 작성하면 된다.
2. 같은 테이블 비교후 MERGE INTO
비교해서 있는지 없는지 확인하는 테이블과 확인후 INSERT, UPDATE 처리할 테이블 이 같은 경우 dual을 통해서 작성 할 수 있다.
MERGE INTO ITEM I : 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 를 실행합니다.
주의!
ON 조건절에 사용할 컬럼을 업데이트하면 오류가 발생한다.
SQL 오류: ORA-38104: ON 절에서 참조되는 열은 업데이트할 수 없음: "A"."JOB"
38104. 00000 - "Columns referenced in the ON Clause cannot be updated: %s"
최근에 카프카 환경에서 merge 사용에서 문제 발생에 대해서도 포스팅하였습니다. 참조하시면 좋을 것 같습니다.
2024.10.18 - [Kafka] - Kafka에서 동시에 같은 메시지 처리 시 발생한 PK 중복 오류(feat. merge로 인한 장애대응)
참조
'RDBMS' 카테고리의 다른 글
[Oracle] 오라클 데이터 복구 (0) | 2023.01.30 |
---|---|
MySQL에서 특정 문자로 문자열 SPLIT 하기 - SUBSTRING_INDEX (2) | 2022.04.19 |
[MySQL] 컬럼 추가, 컬럼 삭제, 컬럼명 변경, 컬럼 타입 변경 (2) | 2022.03.03 |