[ORACLE] [SQL] SELECT 해서 INSERT 하기
동기
프로젝트를 진행 중에 예기치 못한 요구사항으로 인한 DB 변경이 이루어질 때가 있다.
이때, 컬럼만 추가해서 NULL 값이 들어가도 되거나, 그냥 기본 값 = (예를 들어) 1 이 들어간다면 얼마나 좋을까?
하지만, 그룹으로 묶어서 값을 넣어주어야 한다면 좀 더 복잡해지기 마련이다.
그룹으로 묶어서 LEVEL 값을 넣어주어야 했다.
방법
UPDATE /*+ BYPASS_UJVC */ ( SELECT A.COLUMN1 UPD_COL , B.RNUM SEL_COL FROM TABLE_A A , ( SELECT KEY_COLUMN, ROW_NUMBER() OVER(PARTITION BY GROUP_COLUMN1, GROUP_COLUMN2 ORDER BY ORDER_COLUMN) AS RNUM FROM TABLE_A ) B WHERE A.KEY_COLUMN = B.KEY_COLUMN ) SET UPD_COL = SEL_COL
|
헌데, oracle 11g 에서는 에러가 터지는 게 아닌가?!
"ORA-01779"
이유인 즉슨, "BYPASS_UJVC 힌트는 키값의 보존이 되지 않는 치명적 약점을 가지고 있다. 이에 따라 애써 수립한 데이터 아키텍처를 무용지물로 만들 수 있는 위험이 따른다."고 한다.
해결방법
MERGE INTO TABLE_A A USING ( SELECT KEY_COLUMN, ROW_NUMBER() OVER(PARTITION BY GROUP_COLUMN1, GROUP_COLUMN2 ORDER BY ORDER_COLUMN) AS RNUM FROM TABLE_A ) B ON (A.CD= B.CD) WHEN MATCHED THEN UPDATE SET A.UPD_COL = B.RNUM |
참고