我正在使用Access over Oracle数据库系统(基本上使用Access访问表单并使用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 :(得分:2)
忽略不相关的ADO代码,您尝试执行的更新是:
UPDATE TBL_CAPITAL_MGMT_PRODUCT a
INNER JOIN
SET a.TOT_RWA_AMT = b.TOT_RWA_AMT;
Oracle不支持这一点(虽然这个未记载的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子句。
答案 1 :(得分:2)
如果您使用的是Oracle 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;