【问题标题】:Oracle update statement multiple tablesoracle更新语句多表
【发布时间】:2013-03-20 12:25:48
【问题描述】:

我正在使用 Oracle(对它还有点新意),每次运行下面的更新语句时,我都会收到以下错误消息。

SQL Error: ORA-00904: "CH"."CONTRACT_ID": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

这里是查询:

UPDATE wr00262_catalogue_201310 ct SET
   ct.PORTFOLIO_ID = (SELECT ch.PORTFOLIO_ID 
                       from WR00262_CONTRACT_HEADER ch 
                       WHERE ch.PORTFOLIO_ID = ct.PORTFOLIO_ID)
   WHERE ct.NPC in (SELECT ctl.NPC 
                   FROM wr00262_contract_line ctl 
                    WHERE ctl.CONTRACT_ID = ch.CONTRACT_ID);

我想我可能需要加入,但不太确定在哪里或如何加入。 contract_header 表确实有一个名为 CONTRACT_ID 的列。

【问题讨论】:

  • 你想达到什么目的?看起来您正在将 PORTFOLIO_ID 设置为它已有的值。

标签: oracle sql-update


【解决方案1】:

这是一个范围界定问题。一个子查询中的列对任何其他子查询都不可见。所以尝试这样的事情:

UPDATE wr00262_catalogue_201310 ct SET
   PORTFOLIO_ID = (
      SELECT ch.PORTFOLIO_ID 
      from WR00262_CONTRACT_HEADER ch 
      WHERE ch.PORTFOLIO_ID = ct.PORTFOLIO_ID
   )
   WHERE ct.NPC in (
      SELECT ctl.NPC 
      FROM WR00262_CONTRACT_HEADER ch 
      join wr00262_contract_line ctl 
         on ctl.CONTRACT_ID = ch.CONTRACT_ID
      WHERE ch.PORTFOLIO_ID = ct.PORTFOLIO_ID
   );

【讨论】:

  • 运行该语句时会得到以下结果。SQL 错误:ORA-01427:单行子查询返回多行 01427。00000 -“单行子查询返回多行” *原因:*行动:
  • 那是SET =子句中的子查询导致的问题。所以这不是 Egor 引入的错误。您必须为仅返回一个 PORTFOLIO_ID 的子查询定义 WHERE 子句。
  • 但正如@Klas 指出的那样,无论如何,你的说法有点荒谬。
  • @needmorebeerformewallaby - 您的更新声明有问题。看看克拉斯的评论。试着用语言描述你想做什么。
  • 抱歉,Klas 是正确的,部分问题在于引用了错误的表以从中提取新的投资组合 ID。它的表应该是 WR00262NEWPORTFOLIOS,列名为 NEWPORTFOLIOID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
相关资源
最近更新 更多