2010-07-19 86 views
0

我正在使用Access over Oracle數據庫系統(基本上使用Access獲取表單並使用ADO代碼進入表),並試圖使用ADO的值更新產品表中的字段加載表中相同的命名字段。 我使用的代碼是:更新選擇語句的值

.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;" 

它返回有關缺少SET關鍵字的錯誤。所以我把它改爲:

.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;" 

表示返回有關非關鍵,保存表的錯誤。 b表有一個AR_ID pk,但表沒有主鍵,它可能不會得到一個,我不能更新任何表的結構。

我試着用/ * + BYPASS_UJVC * /讓代碼運行,但實際上並沒有做任何事情。

任何人有任何想法,我應該從哪裏去?

感謝

亞歷

+0

我不認爲Access在這裏扮演的角色足以證明關鍵字的正確性(儘管它顯然應該在問題本身中提及)。 – 2010-07-19 19:44:23

回答

2

忽略不相關的ADO代碼,你正在試圖做的更新是:

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

這不是由Oracle支持(雖然也許這無證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 
      );  

最後的WHERE子句是爲了防止TOT_RWA_AMT被設置爲NULL在任何沒有匹配「b」行的「a」行上。如果你知道永遠不會發生,你可以刪除WHERE子句。

+0

如果滿足多個條件,Oracle確實支持包含聯接的視圖更新。 – Allan 2010-07-19 14:42:28

+0

你好託尼,這是運行沒有錯誤,但它保持超時(錯誤ORA-01013)我一次增加超時1分鐘,但兩個表都有大約100,000條記錄,我認爲這將需要一段時間! – Alex 2010-07-19 14:53:52

+0

@Allan:是的,我知道。但它不支持「UPDATE table1 JOIN table2」語法。 – 2010-07-19 15:45:09

2

如果您使用的是Oracle 10g或更高版本,Tony解決方案的替代方案是使用MERGE語句,並且只有MATCHED子句。

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;