코딩항해기
[DBMS/Oracle] MERGE문 본문
MERGE문
조건을 비교해서 테이블에 해당 조건에 맞는 데이터가 없으면 INSERT, 있으면 UPDATE를 수행하는 문장이다.
기본적인 형태가 INSERT UPDATE인 것이며, INSERT DELETE 조합을 사용하기도 한다. 즉, 조건에 따라 어떤 수행할 내용을 결정하는 문법이다. 주로 두 개 이상의 테이블 간의 데이터를 조작하거나 동기화할 때 유용하다.
오라클 9i부터 MERGE 문을 사용할 수 있으며, DELETE 절은 10g부터 사용할 수 있다.
MERGE문 문법
MERGE INTO [스키마.]테이블명
USING (update나 insert될 데이터 원천) ON (update될 조건)
WHEN MATCHED THEN
SET 컬럼1 = 값1, 컬럼2 = 값2, ... WHERE update조건
[DELETE WHERE update_delete조건]
WHEN NOT MATCHED THEN
INSERT (컬럼, ...) VALUES (값, ...)
WHERE insert조건;
주의할 점은 ON절에서 참조되는 열은 갱신(update)할 수가 없다. (ORA-38104)
MERGE INTO team t --데이터를 조작할 테이블
USING member m --데이터 소스 테이블
ON (t.member_id = m.member_id) --조인 조건 및 레코드 매칭기준
WHEN MATCHED THEN --ON절 조건과 일치하는 데이터가 있는 경우
UPDATE SET t.name = m.name, t.email = m.email --update 실행
--where절이 있다면 해당 조건일 때만 실행한다.
WHEN NOT MATCHED THEN --ON절 조건과 일치하는 데이터가 없는 경우
INSERT (team_id, name, email) --insert실행
VALUES (m.member_id, m.name, m.email);
--where절이 있다면 해당 조건일 때만 실행한다.
--insert delete
MERGE INTO members m
USING members_new mn
ON (m.member_id = mn.member_id)
WHEN MATCHED THEN
UPDATE SET m.name = mn.name, m.email = mn.email
DELETE WHERE mn.marked_for_deletion = 'Y'
WHEN NOT MATCHED THEN
INSERT (member_id, name, email)
VALUES (mn.member_id, mn.name, mn.email);
MERGE문 단일테이블(DUAL)
단일 테이블에서 MERGE문을 사용하기 위해서는 USING절에서 DUAL을 사용하면 된다.
MERGE INTO team t
USING (
SELECT 'mini' AS name, 'miniBcake' AS nickname FROM DUAL
) m
ON (t.member_id = 1)
WHEN MATCHED THEN
UPDATE SET t.name = m.name, t.nickname = m.nickname
WHEN NOT MATCHED THEN
INSERT (team_id, name, nickname)
VALUES (1, m.name, m.nickname);
DUAL을 사용하는 경우, 소스 데이터를 일괄 처리할 수 있다는 점과 구문의 요구사항을 만족시킬 수 있다는 점, 성능 향상에 도움이 된다는 장점을 가지고 있다. (가상의 테이블로 데이터베이스 관리 시스템이 처리할 필요가 없기 때문이다.)
MERGE문 JOIN사용
JOIN을 사용해 MERGE문을 작성하는 경우 ON절에 JOIN 조건을 정의한다. 여러 테이블 간의 복잡한 조작에 유용하다.
MERGE INTO members m
USING (SELECT member_id, name, email FROM members_new) mn
ON (m.member_id = mn.member_id)
WHEN MATCHED THEN
UPDATE SET m.name = mn.name, m.email = mn.email
WHEN NOT MATCHED THEN
INSERT (member_id, name, email)
VALUES (mn.member_id, mn.name, mn.email);
'DBMS > Oracle' 카테고리의 다른 글
[DBMS/Oracle] 시노님 Synonym (0) | 2025.02.26 |
---|---|
[DBMS/Oracle] USER 계정 생성 (cmd) (0) | 2024.08.26 |
[DBMS/Oracle] 다차원 집계함수 (CUBE, ROLLUP, GROUPING SETS) (0) | 2024.08.24 |
[DBMS/Oracle] Null 관련 함수 (NULLIF, COALESCE) (0) | 2024.08.23 |
[DBMS/Oracle] SQL 실행 순서 (조건 위치 효율성) (0) | 2024.08.21 |