2010-07-19 6 views
0

오라클 데이터베이스 시스템을 통한 액세스 (기본적으로 양식에 대한 액세스와 ADO 코드를 사용하는 테이블 사용)를 사용 중이며 값이있는 제품 테이블의 필드를 업데이트하려고합니다. 로드 테이블에있는 동일한 이름의 필드. 내가 사용하고 코드는 다음과 같습니다 비 키 보존 테이블에 대한 오류를 반환select 문에서 값 업데이트

.CommandText = "UPDATE (SELECT a.TOT_RWA_AMT, b.TOT_RWA_AMT As New_RWA_AMT FROM " & strSchema & ".TBL_CAPITAL_MGMT_TEMP_LOAD a INNER JOIN " & strSchema & ".TBL_CAPITAL_MGMT_PRODUCT b ON b.AR_ID = a.AR_ID Where a.New_Rec <> '-1' AND a.IP_ID Is Not Null) c SET c.New_RWA_AMT = c.TOT_RWA_AMT;" 

:

SET 키워드 누락에 대한 오류를 반환
.CommandText = "UPDATE " & strSchema & ".TBL_CAPITAL_MGMT_PRODUCT a INNER JOIN " & strSchema & ".TBL_CAPITAL_MGMT_TEMP_LOAD b ON a.AR_ID = b.AR_ID SET a.TOT_RWA_AMT = b.TOT_RWA_AMT;" 

는 .. 그래서 나는 그것을 변경했습니다. b 테이블에는 AR_ID의 pk가 있지만 테이블에는 기본 키가 없으며 아마도 테이블을 가져 오지 않을 것입니다. 테이블의 구조를 업데이트 할 수 없습니다.

코드를 실행시킬 수있는/* + BYPASS_UJVC * /를 사용했지만 실제로 아무 것도하지 않는 것 같습니다.

누구나 내가 여기에서해야 할 아이디어가 있습니까?

감사

알렉스 무관 한 ADO 코드를 무시

+0

여기서는 액세스가 중요한 역할을한다고 생각하지 않습니다.하지만 분명히 키워드 자체를 언급해야합니다. –

답변

2

, 당신이하려고하는 업데이트는 다음과 같습니다

UPDATE TBL_CAPITAL_MGMT_PRODUCT a 
INNER JOIN 
SET a.TOT_RWA_AMT = b.TOT_RWA_AMT; 

이 (오라클에서 지원하지 않는 어쩌면이 문서화되지 않은 BYPASS_UJVC 힌트하지만 그것을 극복하기로되어 있지만, 지금까지는 그것을 알지 못했습니다.)

는 인라인 뷰 버전이 상관 하위 쿼리를 사용하여 다시 기존의 오라클의 접근 방식에 떨어질 할 수 있습니다 인해 제약의 부족으로 실패 감안할 때 :

UPDATE TBL_CAPITAL_MGMT_PRODUCT a 
SET a.TOT_RWA_AMT = (SELECT b.TOT_RWA_AMT 
         FROM TBL_CAPITAL_MGMT_TEMP_LOAD b 
         WHERE a.AR_ID = b.AR_ID 
        ) 
WHERE EXISTS (SELECT NULL 
       FROM TBL_CAPITAL_MGMT_TEMP_LOAD b 
       WHERE a.AR_ID = b.AR_ID 
      );  

절은 TOT_RWA_AMT이 NULL로 설정되지 않도록하는 것입니다 WHERE 마지막 일치하는 "b"행이없는 모든 "a"행에. 그럴 수 없다는 것을 안다면 WHERE 절을 제거 할 수 있습니다.

+0

여러 조건이 충족되는 경우 Oracle은 조인이 포함 된보기에 대한 업데이트를 지원합니다. – Allan

+0

안녕하세요, tony가 오류없이 실행되고 있지만 시간 초과가 계속됩니다 (오류 ORA-01013) 한 번에 1 분 제한 시간을 늘리고 있습니다.하지만 두 테이블 모두에 약 100,000 개의 레코드가 있으므로 시간이 좀 걸릴 것으로 생각됩니다. ! – Alex

+0

@Allan : 예, 알고 있습니다. 그러나 "UPDATE table1 JOIN table2"구문을 지원하지 않습니다. –

2

오라클 10g 이상을 사용하는 경우 Tony의 솔루션 대신 MATCHED 절과 함께 MERGE 문을 사용하는 것이 좋습니다.

MERGE INTO TBL_CAPITAL_MGMT_PRODUCT a 
    USING TBL_CAPITAL_MGMT_TEMP_LOAD b 
    ON (a.AR_ID = b.AR_ID) 
WHEN MATCHED THEN 
    UPDATE SET a.TOT_RWA_AMT = b.TOT_RWA_AMT; 
관련 문제