이러쿵저러쿵


오라클에서 쿼리를 짜고 돌리는데, 아래와 같은 에러 메시지가 떴습니다..!!

 

ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다

 

무슨 문제일까요?

다른 경우에도 위와 같은 문제가 발생하는지 모르겠지만, 일단 MERGE INTO 구문에서 발생합니다. 제 경우에도 그랬습니다.^^

 

MERGE INTO는 어떻게 사용되는지 아래 간략하게 그 사용 구문 형태를 작성하였으며, 해당 오류가 발생한 경우라면 보통 MERGE INTO에 대해 이미 어느정도 숙지하고 있는 것일 것이므로, 아래의 사용법 정도로만 설명하고, 자세한 사용법은 생략합니다.

 

 

MERGE INTO table_name alias -- 작업 대상 테이블 명 (실제 데이터를 INSERT 또는 UPDATE할 테이블)
    USING (table | view | subquery) alias -- 실제 데이터를 조회할 대상 테이블(또는 뷰, 서브쿼리), 대상 테이블이 없는 경우 DUAL 테이블 사용
        ON (join condition) -- 조건절 (Where절) 이 조건에 의해 아래 MATCHED / NOT MATCHED 로 분기.
            WHEN MATCHED THEN -- ON 조건에 해당하는 데이터(레코드)가 존재한다면 
                UPDATE SET [column1] = [value1] ... -- 해당 레코드를 대상으로 UPDATE 실행
            WHEN NOT MATCHED THEN -- ON 이하의 조건에 해당하는 데이터(레코드)가 존재하지 않는다면
                INSERT (column1, column2 ...) VALUES (value1, value2 ...); -- 새 데이터를 추가해야 하므로 INSERT 실행

 

 

위의 MERGE INTO 구문 중에 INSERT와 UPDATE는 하나의 레코드를 대상으로 작업을 수행할 수 있는데, 2개 이상의 SELECT 결과가 나와서 발생하는 오류입니다.

 

다시 말하면 USING () ON () 조건에 의해 SELECT 된 결과를 대상 테이블(table_name)에 INSERT  또는 UPDATE하게 되는데, 이 때 INSERT 되어야 할 레코드가 중복(Duplication, 동일한 레코드가 2개 삽입되는 것으로 보통 PK 무결성에 위배되어 발생)되거나(NOT MATCHED 분기인 경우) UPDATE 되어야 할 레코드가 2개 이상(Multirow)되는 경우(MATCHED 분기인 경우)에 해당 오류가 발생합니다.

 

문제 해결 방법은 간단히 ON(join condition) 조건에 의해 USING () 에서 산출되는 결과 집합(테이블, 뷰 또는 서브쿼리)의 결과가 중복된 레코드를 갖지 않도록 쿼리를 수정하면 됩니다.

 

* 참고로 오라클과 유사하게 동작하는 Merge 구문은 MS SQL Server에서도  2008버전 부터 지원하고 있습니다.

 

저작자 표시 비영리 변경 금지
신고


Comment +0

티스토리 툴바