Oracle-使用join更新

Oracle-使用join更新,oracle,join,sql-update,Oracle,Join,Sql Update,使用oracle11g。我需要做一个自我加入更新。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.

使用oracle11g。我需要做一个自我加入更新。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 3810400000-无法更新ON子句中引用的列:%s *原因:更新集的LHS包含ON子句中引用的列


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

第一种情况下的错误是因为您试图使用仅在子查询范围内有效的表别名引用列。您应该能够通过对列进行别名处理来解决这一问题:

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-无法修改映射到非键保留表的列*原因:试图插入或更新映射到非键保留表的联接视图的列*操作:直接修改基础基表。