2012-12-17

[ORACLE] Join Update


Sql Server에서 Join Update는 아래와 같이 쉽게 가능 함

Update A_TableName Set Column = B.Column
From A_TableName as A Inner join
        B_TableName as B ON A.keyColumn = B.keyColumn
Where A.Column <> B.Column


Oracle의 경우 아래와 같은 문법으로 가능

UPDATE  /*+bypass_ujvc*/
(
    SELECT A.Column, B.RefColumn
    FROM ATable A,
    BTable B
    WHERE A.keyColumn = B.keyColumn
)
SET Column = RefColumn


inner join을 한 다음, 수정할 필드와 대상 필드를 조회하고,
그 데이터를 가져와서 바로 업데이트 처리...


**** 특이점..
/*+bypass_ujvc*/
이 부분을 빼고 쿼리를 돌리는 경우
ORA-01779:키-보존된것이 아닌 테이블로 대응한 열을 수정할 수 없습니다.
(ORA-01779 cannot modify a column which maps to a non key-preserved table)
라는 메시지와 함께 에러 발생!!!

이 부분은 Constraint를 피해서 Join Update를 할수 있도록 해주는 구문(힌트)이다.

Join Update 라 함은 1:1 혹은 1:M 로 묶인 상태에서 왼편..즉 M쪽 집합이어야 하는데..
1쪽 집합의 조인하는 컬럼이 UK혹은 PK로 설정되어 있어야 한다..
만약 그런 상황이라면 /*+bypass_ujvc*/ 구문은 없어도 쿼리가 동작한다..
하지만..대부분의 경우 여러개의 테이블을 조인하거나 엑셀등의 데이터를
data import 해서 만들어진 테이블들과 조인을 하는 경우가 많기에 UK 혹은 PK로 설정하고
업데이트를 실행하기가 쉽지 않다..
그럴때 '오라클에서 잘못되어도 책임지지 않음' 이라는 의미로 쓰는 힌트이다..

댓글 없음:

댓글 쓰기