ORA-30926 오류는 Oracle Database에서 MERGE나 UPDATE 작업 시 동일한 대상 행(row)을 두 번 이상 갱신하려 할 때 발생하는 에러입니다. 주로 소스 데이터에 중복된 키가 있거나 ON 조건이 불완전해 하나의 대상 행에 여러 소스 행이 매칭될 때 나타납니다.
📌 ORA-30926 오류 개요
- 에러 메시지: ORA-30926: unable to get a stable set of rows in the source tables
- 원인:
- 소스 테이블에 중복된 키 값 존재
- ON 절의 조인 조건 불충분 → 하나의 대상 행에 여러 소스 행 매칭
- 비결정적(non-deterministic) WHERE 절 사용
- ETL 과정에서 데이터 품질 문제 (중복 데이터 유입)
🔎 발생 시나리오 예시
- MERGE INTO target USING source ON (target.id = source.id)
- source에 동일한 id 값이 여러 개 존재하면, target의 한 행이 두 번 갱신되려 하여 오류 발생.
- 중복된 ROWID가 USING 절 서브쿼리에서 반환될 경우에도 동일한 문제가 생김.
✅ 해결 방법
- DISTINCT: 소스 쿼리에서 중복 제거
sql
MERGE INTO target t
USING (SELECT DISTINCT id, val FROM source) s
ON (t.id = s.id)
WHEN MATCHED THEN UPDATE SET t.val = s.val;
- ROW_NUMBER(): 중복 키가 있을 경우 하나만 선택
sql
MERGE INTO target t
USING (
SELECT id, val
FROM (
SELECT id, val, ROW_NUMBER() OVER (PARTITION BY id ORDER BY val) rn
FROM source
) WHERE rn = 1
) s
ON (t.id = s.id)
WHEN MATCHED THEN UPDATE SET t.val = s.val;
- ON 절 수정: 조인 조건을 더 구체적으로 작성해 중복 매칭 방지
- 소스 테이블 정제: MERGE 실행 전 중복 데이터 제거
⚠️ 주의할 점
- MERGE 문은 결정적(deterministic)이어야 하며, 동일 행을 여러 번 갱신할 수 없음.
- 오류를 단순히 회피하기보다 데이터 품질 관리와 조인 조건 검증이 근본적인 해결책.
- 대규모 DML 작업 중 발생할 수 있으므로, 사전 검증 SELECT로 매칭 결과를 확인하는 것이 안전.
