2026/08/26

오늘의 이야기



ORA-30926 오류는 Oracle Database에서 MERGEUPDATE 작업 시 동일한 대상 행(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로 매칭 결과를 확인하는 것이 안전.





댓글 없음:

댓글 쓰기

오늘의 이야기

#스하리1000명프로젝트, Lost in Korea? Even if you don't speak Korean, this app helps you get around easily. Just speak your language—it trans...