복붙노트

[SQL] 오라클 - 업데이트에 가입 - 비 키 보존 테이블을

SQL

오라클 - 업데이트에 가입 - 비 키 보존 테이블을

나는 정확히하지 않는 오라클에 존재 명령, "TBL2에서 업데이트 TBL1"는 앵그르를 복제하는 것을 시도하고있다.

내가 사용 그래서 명령 "업데이 트를 (TBL2 ... 가입 TBL1 해당)". "비 키 보존 테이블에 매핑되는 열을 수정할 수 없습니다 ORA-01779는"두 테이블은 기본 키 정의와 나는 나의 고유 행을 식별 된 조인 생각하지만, 난 여전히 얻고있다.

여기에 적절하게 테이블 정의와 내가 실행하기 위해 노력하고있어 업데이트를 익명화 :

CREATE TABLE tbl1
(
   ID decimal(11) NOT NULL,
   A varchar2(3) NOT NULL,
   B float(7),
   CONSTRAINT tbl1_pk PRIMARY KEY (ID,A)
)
;

CREATE TABLE tbl2
(
   ID decimal(11) NOT NULL,
   A varchar2(3) NOT NULL,
   B float(15),
   C float(15),
   D char(1) NOT NULL,
   CONSTRAINT tbl2_PK PRIMARY KEY (ID,A,D)
)
;

UPDATE 
  (select tbl1.b, tbl2.c 
   from tbl1 inner join tbl2 
   on tbl1.id=tbl2.id 
   and tbl1.a=tbl2.a 
   and tbl1.b=tbl2.b 
   and tbl1.a='foo' 
   and tbl2.D='a') 
set b=c;

어떻게 오라클은 내가 더 고유성 위반이 없다고 만족하실 것입니다 나의 선택 같은 정의 할 수 있습니다?

해결법

  1. ==============================

    1.당신은 상관 하위 쿼리와 함께이 작업을 수행 할 수 있어야한다

    당신은 상관 하위 쿼리와 함께이 작업을 수행 할 수 있어야한다

    UPDATE tbl1 t1
       SET t1.b = (SELECT c
                     FROM tbl2 t2
                    WHERE t1.id = t2.id
                      AND t1.a  = t2.a
                      AND t1.b  = t2.b
                      AND t2.d  = 'a')
     WHERE t1.a = 'foo'
       AND EXISTS( SELECT 1
                     FROM tbl2 t2
                    WHERE t1.id = t2.id
                      AND t1.a  = t2.a
                      AND t1.b  = t2.b
                      AND t2.d  = 'a')
    

    당신이 작성한 것을 UPDATE에 대한 문제는 오라클이 정확히 1 tbl2.c 값이 있음을 보장 할 수 없습니다입니다 단일 tbl1.b 값에 해당합니다. TBL1의 특정 행에 대해 TBL2에서 여러 행이있는 경우, 상관 업데이트는 단일 행 부질의 여러 행을 반환 있음을 나타내는 오류가 발생하는 것입니다. 이 경우, 당신은이 경우에 사용하는 TBL2에서하는 행 지정하는 하위 쿼리 일부 로직을 추가해야 할 것입니다.

  2. ==============================

    2.이 기본 tbl1table을 수정 시도하고 TBL1 테이블 키 보존 뷰에 있지 않기 때문에이 문장은 오류 (ORA-01779가 아닌 키 보존 테이블에 매핑되는 열을 수정할 수 없습니다)와 함께 실패합니다. (ID, A)는 DEPT 테이블의 키이지만, 그것은 가입의 핵심이 아니기 때문에.

    이 기본 tbl1table을 수정 시도하고 TBL1 테이블 키 보존 뷰에 있지 않기 때문에이 문장은 오류 (ORA-01779가 아닌 키 보존 테이블에 매핑되는 열을 수정할 수 없습니다)와 함께 실패합니다. (ID, A)는 DEPT 테이블의 키이지만, 그것은 가입의 핵심이 아니기 때문에.

  3. ==============================

    3.당신의보기에 따라 (http://www.orafaq.com/tuningguide/updateable%20view.html)을 키 - 보존도없는 것 같다. 실제로 당신은 허용되지 않는 것 같습니다 차없는 키를에 가입하여합니다.

    당신의보기에 따라 (http://www.orafaq.com/tuningguide/updateable%20view.html)을 키 - 보존도없는 것 같다. 실제로 당신은 허용되지 않는 것 같습니다 차없는 키를에 가입하여합니다.

  4. from https://stackoverflow.com/questions/9335536/oracle-update-join-non-key-preserved-table by cc-by-sa and MIT license