2017-11-22 5 views
0

조인이있는 선택 쿼리를 기반으로하는 업데이트 쿼리를 적용하려고하지만 작동하지 않습니다.조인이 작동하지 않는 선택 쿼리를 기반으로하는 Oracle Update 문

UPDATE (
    SELECT 
    LOCATION_NUM, LOCATION_TYPE, LOCATION_CITY, ACCOUNT_NUM 
    FROM 
    TBLSALES T1 
    INNER JOIN TBLCENTER T2 ON T2.LOCATION_ID = T1.LOCATION_ID 
    INNER JOIN TBLACCOUNT T3 ON T3.ACCOUNT_ID = T1.ACCOUNT_ID 
    WHERE 
    LOCATION_CITY = 'New York' 
    AND LOCATION_NUM LIKE 'NY1%' 
    AND ACCOUNT_NUM IN ('40001','40002','40003') 
) 
SET 
    LOCATION_TYPE = 'TYPE 1' 
; 

을 실행 내가받을 다음과 같은 오류 : 당신을 통해 업데이 트를 시도 당신처럼, 가입하면

SQL Error: ORA-01779: cannot modify a column which maps to a non key preserved table 

답변

2

것은 두 가지 조건이 충족되어야합니다

  • 룩업 키 조회 테이블 (두 개의 테이블이 있으므로 두 조회 키 location_idtblcenter이고 account_idtblaccount)은 중복되어서는 안됩니다. 그것은 "유일한 값"("중복 값 없음"의 의미에서)이어야합니다. 이는 분명한 논리적 요구 사항입니다. 그것이 충족되지 않으면 모호한 조회를 기반으로 업데이트하는 문제는 난센스입니다.
  • 오라클은 구문 분석시 고유성이 유지 될 수 있도록을 사전에 알고 있어야합니다 (). 즉, 테이블에는 고유 한 제한 조건 및/또는 해당 C 럼에 대한 고유 인덱스가 있어야합니다. 이는 논리적 요구 사항이 아니라 오라클 구현 요구 사항입니다. 오류 메시지는이 두 번째 조건이 충족되지 않았 음을 알려주고 있습니다.

어떻게 해결할 수 있습니까? 당신은 몇 가지 옵션이 있습니다

  • 간단한 : 해당 테이블에서 그 컬럼에 UNIQUE 제약 (또는 PRIMARY KEY 제약 조건)을 만들 수 있습니다. 매우 가능성이 높습니다. 을 의미하지만 처음에는 PK가됩니다. 여기에 "기본 키"또는 "고유 한"제약 이 응용 프로그램에 유지됩니다. - PeopleSoft에서 예로 들었 듯이 은 도움이되지 않습니다..

  • MERGE 문을 통해 업데이트 할 수 있습니다. 구문은 매우 유사합니다. 차이점은 MERGE가 모든 데이터를 볼 때까지 대기하고 실제로 인 경우은 중복이 발견되지 않아야하는 실제 데이터에서 중복을 찾습니다.

  • 약간 덜 효율적하지만, 확실한 해결 방법 : 업데이트가 설정 LOCATION_TYPE = '유형 1'을 (.....)

을 tblsales

로 문을 다시 .. 이제는 WHERE 절에 실제로 들어 가지 않는다는 것을 깨달았습니다. 어느 열이 어떤 테이블에서 왔는지 (UPDATE 문 자체에서 말하면) 도움이 될 것입니다. LOCATION_NUM이 SALES 테이블에 있다고 추측하겠습니까? 그런 다음 WHERE 절은

where location_num like 'NY1%' 
    and location_num in (select location_num from the three-way join) 

과 같아야합니다 (원래 UPDATE 문의 의미라고 가정 함).