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
오라클에서도 위와 비슷한 방법으로 업데이트가 가능하다고 한다..
(그렇지만..본인이 테스트를 했을때는 되지 않았다..)
오라클에서 권장하는 문법은 다음 과 같다..
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로 설정하고
업데이트를 실행하기가 쉽지 않다..
그럴때 '오라클에서 잘못되어도 책임지지 않음' 이라는 의미로 쓰는 힌트이다..
Hope this helps..