update /*+ bypass_ujvc */ ( select a.gbn as a_a, b.gbn as b_b from main a, step b where a.id = b.id and a.time='01' ) set a_a = b_b
이렇게 쿼리날렸는데도 키보존오류가납니다 해결방법없을까요? ㅠㅠ
by 마농
[2012.03.05 16:41:49]
오라클 버전이 어떻게 되나요? 11G 부터는 사용할 수 없는 힌트인걸로 압니다. 키보존이 안되서 나는 오류를 무시해라 라는 힌트죠.
그럼 키보존이 되도록 하려면? b.id 가 유니크 하다는 것을 설정해주셔야 합니다. b 테이블에 id로 PK 나 UK 를 만들면 해결이 되구요. 만약 b.id 가 유일하지 않다면 쿼리 자체가 논리적으로 모순입니다. 말도 안되는 구문이라는 말이죠.
PK 나 UK 설정을 할 수 없는 상황이라면 수정가능조인뷰 방식을 다른 방식으로 바꾸셔야 합니다. 서브쿼리 방식 또는 머지방식...
UPDATE main a SET gbn = (SELECT gbn FROM step b WHERE b.id = a.id) WHERE a.time = '01' AND EXISTS (SELECT 1 FROM step b WHERE b.id = a.id) ;
MERGE INTO main a USING (SELECT a.id, b.gbn FROM main a, step b WHERE a.id = b.id AND a.time='01') c ON (a.id = c.id) WHEN MATCHED THEN UPDATE SET gbn = c.gbn ;
by 풋내기
[2012.03.05 19:28:59]
와 정말 친절한 답변감사합니다^^ 많은 도움이 되었습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.