MERGE 문을 UPDATE 문으로 변경
2025. 2. 18. 00:03ㆍIT/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
);반응형
'IT > Oracle' 카테고리의 다른 글
| DBMS_JOB 모니터링 (3) | 2025.02.19 |
|---|---|
| 오라클 테이블 별 용량 확인 SQL 쿼리 (0) | 2025.02.19 |
| 오라클 Lock (0) | 2025.02.16 |
| PL/SQL Function / Procedure 실행 오류 확인 방법 (0) | 2025.02.15 |
| 정적 SQL(Static SQL)과 동적 SQL(Dynamic SQL) 비교(ㅇ) (0) | 2025.02.15 |