티스토리 뷰

728x90

동기

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

반응형
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday