본문 바로가기
개발자의 삶/DB

[ORACLE] [SQL] SELECT 해서 INSERT 하기

by 나.R.D.(Rule Destoryer) 2017. 1. 2.

동기

프로젝트를 진행 중에 예기치 못한 요구사항으로 인한 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




참고

http://www.gurubee.net/lecture/2795

반응형

댓글