MERGE 문을 UPDATE 문으로 변경

2025. 2. 18. 00:03IT/Oracle

반응형

MERGE 문을 UPDATE 문으로 변경하려면 조건에 맞는 행을 갱신하는 UPDATE 구문으로 바꾸면 됩니다.
다만, MERGE 문은 매칭 시 업데이트와 비매칭 시 삽입(INSERT)을 동시에 처리하므로, 이를 UPDATE + INSERT로 나누어 처리해야 합니다.

아래에 변환 방법을 단계별로 설명합니다


1. 기존 MERGE 문 구조


다음과 같은 MERGE 문이 있다고 가정합니다:

MERGE INTO target_table t
USING source_table s
ON (t.id = s.id)
WHEN MATCHED THEN
    UPDATE SET t.value = s.value, t.updated_at = SYSDATE
WHEN NOT MATCHED THEN
    INSERT (id, value, created_at) VALUES (s.id, s.value, SYSDATE);

 

동작 설명
1. id가 일치하면 → value와 updated_at 업데이트
2. 일치하지 않으면 → 새로운 행 삽입


1) WHEN MATCHED → UPDATE 문

UPDATE target_table t
SET t.value = (SELECT s.value FROM source_table s WHERE s.id = t.id),
    t.updated_at = SYSDATE
WHERE EXISTS (SELECT 1 FROM source_table s WHERE s.id = t.id);

설명:
• EXISTS를 사용하여 일치하는 행만 업데이트합니다.
• **하위 쿼리의 SELECT**는 일치하는 source_table의 값을 가져옵니다.

 

2) WHEN NOT MATCHED → INSERT 문

INSERT INTO target_table (id, value, created_at)
SELECT s.id, s.value, SYSDATE
FROM source_table s
WHERE NOT EXISTS (
    SELECT 1 FROM target_table t WHERE t.id = s.id
);

설명:
• NOT EXISTS를 사용하여 타겟 테이블에 없는 행만 삽입합니다.
• 중복 삽입 방지를 위해 NOT EXISTS를 사용합니다.

2. 주의사항

  • MERGE는 단일 SQL로 업데이트/삽입을 처리하지만,
    → UPDATE와 INSERT는 별도 트랜잭션으로 실행되므로 성능에 영향이 있을 수 있습니다.
  • 동시성 문제
    • 다중 사용자 환경에서 동시에 실행될 경우 경합이 발생할 수 있습니다.
    • 해결 방법: LOCK 사용 또는 SERIALIZABLE 트랜잭션 모드 적용.


3. 최종 변환 코드

MERGE → UPDATE + INSERT

--  UPDATE 단계
UPDATE target_table t
SET t.value = (SELECT s.value FROM source_table s WHERE s.id = t.id),
    t.updated_at = SYSDATE
WHERE EXISTS (
    SELECT 1 FROM source_table s WHERE s.id = t.id
);

-- INSERT 단계
INSERT INTO target_table (id, value, created_at)
SELECT s.id, s.value, SYSDATE
FROM source_table s
WHERE NOT EXISTS (
    SELECT 1 FROM target_table t WHERE t.id = s.id
);
반응형