【问题标题】:Update value from a select statement从 select 语句更新值
【发布时间】:2010-07-19 13:48:18
【问题描述】:

我正在使用 Oracle 数据库系统上的 Access(基本上将 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,但 a 表没有主键,它可能不会得到主键,我无法更新任何表的结构。

我尝试使用 /*+ BYPASS_UJVC */ 让代码运行,但实际上似乎没有做任何事情。

有人知道我应该从这里去哪里吗?

谢谢

亚历克斯

【问题讨论】:

  • 我认为 Access 在这里发挥的作用不足以证明关键字的合理性(尽管显然应该在问题本身中提及)。

标签: oracle ms-access ado


【解决方案1】:

忽略不相关的 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 子句。

【讨论】:

  • 如果满足多个条件,Oracle 确实支持更新包含连接的视图。
  • 嗨,托尼,它运行没有错误,但它一直超时(错误 ORA-01013)我一次将超时时间增加 1 分钟,但两个表中都有大约 100,000 条记录认为这需要一段时间!
  • @Allan:是的,我知道。但是它不支持“UPDATE table1 JOIN table2”语法。
  • 对不起,我误会了。我以为你说它不支持后一种语法:“update (select ... from table1 JOIN table2 ...)”。
【解决方案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;

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2017-01-15
    • 1970-01-01
    • 2017-02-22
    • 2014-05-15
    • 2013-04-26
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多