从select语句更新值

时间:2010-07-19 13:48:19

标签: oracle ms-access ado

我正在使用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 * /让代码运行,但实际上似乎没有做任何事情。

任何人都有任何想法我应该从这里出发?

由于

亚历

2 个答案:

答案 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;