我正在使用Oracle数据库系统上的Access (基本上使用Access作为表单,并使用ADO代码进入表中),并尝试使用加载表中相同名称字段的值来更新product表中的字段。我使用的代码是:
.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表的pk是AR_ID,但是a表没有主键,它可能得不到主键,我不能更新任何表的结构。
我尝试使用/*+ BYPASS_UJVC */,它允许代码运行,但实际上似乎没有做任何事情。
有没有人知道我该怎么做?
谢谢
亚历克斯
发布于 2010-07-19 22:22:13
忽略不相关的ADO代码,您尝试进行的更新是:
UPDATE TBL_CAPITAL_MGMT_PRODUCT a
INNER JOIN
SET a.TOT_RWA_AMT = b.TOT_RWA_AMT;
甲骨文不支持这一点(尽管这个未公开的BYPASS_UJVC提示应该可以克服这一点,但我直到现在才意识到这一点)。
鉴于您的内联视图版本由于缺乏约束而失败,您可能不得不使用使用相关子查询的传统Oracle方法:
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子句是为了防止在没有匹配"b“行的任何"a”行上将TOT_RWA_AMT设置为NULL。如果您知道这永远不会发生,您可以删除WHERE子句。
发布于 2010-07-20 15:33:37
如果您使用的是Oracle10g或更高版本,那么可以使用只带MATCHED
子句的MERGE
语句来替代Tony的解决方案。
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;
https://stackoverflow.com/questions/3281617
复制相似问题