수색…


소개

광범위한 오해 (SO 포함)와는 달리 오라클은 조인을 통해 업데이트를 허용합니다. 그러나 몇 가지 (꽤 논리적 인) 요구 사항이 있습니다. 우리는 작동하지 않는 것을 설명하고 간단한 예를 통해 무엇을하는지 설명합니다. 이를 달성하는 또 다른 방법은 MERGE 문입니다.

예 : 작동하는 것과하지 않는 것

create table tgt ( id, val ) as 
  select 1, 'a' from dual union all
  select 2, 'b' from dual
;

Table TGT created.

create table src ( id, val ) as 
  select 1, 'x' from dual union all
  select 2, 'y' from dual
;

Table SRC created.

update
  ( select t.val as t_val, s.val as s_val
    from   tgt t inner join src s on t.id = s.id
  )
set t_val = s_val
;

SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 -  "cannot modify a column which maps to a non key-preserved table"
*Cause:    An attempt was made to insert or update columns of a join view which
           map to a non-key-preserved table.
*Action:   Modify the underlying base tables directly.

src.id 에 여러 값을 사용하여 src.val 열에 값 1 이 두 번 이상 있으면 어떻게 될지 상상해보십시오. 분명히 업데이트는 의미가 없습니다 (모든 데이터베이스에서 논리적 인 문제입니다). 이제, 우리는에는 중복이없는 것을 알고 src.id 하지만 오라클 엔진은 몰라 - 그래서 불평. 아마도 이것이 많은 실무자들이 오라클이 "조인으로 업데이트하지 못했다"고 생각하는 이유입니다.

오라클이 기대하는 것은 src.id 가 고유해야하며, 오라클이 미리 알고 있어야한다는 것입니다. 쉽게 고정! 업데이트에 대한 일치가 둘 이상의 열을 사용해야하는 경우 복합 키가있는 경우 (둘 이상의 열에서) 동일한 작업을 수행합니다. 실제로 src.id 는 PK tgt.id 수 있고 tgt.id 는이 PK를 가리키는 FK 일 수 있지만 join을 사용한 업데이트에는 관련이 없습니다. 어떤 관련 것은 고유 제한 조건입니다.

alter table src add constraint src_uc unique (id);

Table SRC altered.

update
  ( select t.val as t_val, s.val as s_val
    from   tgt t inner join src s on t.id = s.id
  )
set t_val = s_val
;

2 rows updated.

select * from tgt;

ID  VAL
--  ---
 1  x
 2  y

동일한 결과는 MERGE 문 (자체 문서에 대한 자격이 있음)으로 얻을 수 있으며 개인적으로 이러한 경우 MERGE를 선호하지만 이유는 "Oracle은 조인을 통한 업데이트를 수행하지 않습니다." 이 예제에서 보듯 Oracle 조인을 사용하여 업데이트를 수행합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow