2010-07-19 58 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;