【问题标题】:Oracle - Update with joinOracle - 加入更新
【发布时间】:2014-12-30 18:22:32
【问题描述】:

使用 Oracle 11g。我需要使用自加入进行更新。 Oracle 不支持连接更新,并且使用 MERGE 不起作用,因为我正在尝试对 on 子句中使用的列进行更新

我尝试过的:

update 
  (
     select  a.ID, a.FROM_STAGE_ID, a.TO_STAGE_ID, b.TO_STAGE_ID 
       from  STATES a,
             STATES b
      where  a.ID = b.ID and
             a.TO_STAGE_ID = b.FROM_STAGE_ID and
             a.TO_STAGE_ID = 'FIZZBUZZ' and
             a.FROM_STAGE_ID <> b.TO_STAGE_ID and
             a.CODE = b.CODE
   )
   set a.TO_STAGE_ID=b.TO_STAGE_ID;

这导致:“SQL 错误:ORA-00904:“B”。“TO_STAGE_ID”:无效标识符”

 MERGE
   INTO STATES a
  USING STATES b
     ON (  
           a.ID = b.ID and
           a.TO_STAGE_ID = b.FROM_STAGE_ID and
           a.TO_STAGE_ID = 'FIZZBUZZ' and
           a.FROM_STAGE_ID <> b.TO_STAGE_ID and
           a.CODE = b.CODE
         )
  WHEN MATCHED THEN
  UPDATE
  set a.TO_STAGE_ID = b.TO_STAGE_ID;

这导致:“SQL 错误:ORA-38104:无法更新 ON 子句中引用的列:“A”。“TO_STAGE_ID” 38104. 00000 - “不能更新 ON 子句中引用的列:%s” *原因:UPDATE SET 的 LHS 包含 ON 子句中引用的列

我可以尝试从暂存/临时表中删除需要更新和填充的行,但我很想看看是否还有其他方法。

【问题讨论】:

    标签: oracle join sql-update


    【解决方案1】:

    第一种情况的错误是因为您尝试使用仅在子查询范围内有效的表别名来引用列。您应该可以通过给列加上别名来解决这个问题:

    update 
      (
         select  a.ID, a.FROM_STAGE_ID, a.TO_STAGE_ID a_to_stage_id, b.TO_STAGE_ID b_to_stage_id
           from  STATES a,
                 STATES b
          where  a.ID = b.ID and
                 a.TO_STAGE_ID = b.FROM_STAGE_ID and
                 a.TO_STAGE_ID = 'FIZZBUZZ' and
                 a.FROM_STAGE_ID <> b.TO_STAGE_ID and
                 a.CODE = b.CODE
       )
       set a_to_stage_id = b_to_stage_id
    

    这仍然可能不起作用 - 这取决于连接是否保留了原始表的键。

    【讨论】:

    • 谢谢,但没有骰子。 “SQL 错误:ORA-01779:无法修改映射到非键保留表 01779 的列。00000 - “无法修改映射到非键保留表的列” *原因:尝试插入或更新映射到非键保留表的连接视图的列。*操作:直接修改基础基表。"
    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 2019-07-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多