오라클에서 쿼리를 짜고 돌리는데, 아래와 같은 에러 메시지가 떴습니다..!!
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버전 부터 지원하고 있습니다.
'개발&컴퓨터 > DB' 카테고리의 다른 글
[MSSQL] DB 로그 파일 축소하기 (5) | 2014.12.28 |
---|---|
[오라클] ORA-02287: 시퀀스 번호는 이 위치에 사용할 수 없습니다. (0) | 2014.12.05 |
[MSSQL] SQL Server 에이전트 이용하여 DB 자동 백업 설정하기 (0) | 2014.11.05 |
MSSQL - INSERT 구문에 MAX 사용하기. (2) | 2014.10.26 |
[MSSQL] 백업 세트에 기존 데이터베이스가 아닌 데이터베이스의 백업이 있습니다 (오류해결방법) (6) | 2014.10.04 |