2014-12-30 69 views
0

使用Oracle 11g。我需要使用自連接進行更新。 Oracle不支持更新與聯接和使用合併不工作,因爲我想做什麼,我試過在使用上的條款Oracle - 通過加入更新

列的更新:

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子句中引用的列

我可以嘗試刪除需要更新並從臨時/臨時表中填充它們的行,但有興趣查看是否存在是另一種方式。

回答

0

第一種情況中的錯誤是因爲您試圖使用僅在子查詢範圍內有效的表別名來引用列。您應該能夠通過走樣列要解決這個問題:

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 

這仍然可能無法正常工作 - 這取決於是否連接保留原始表的鍵。

+0

謝謝,但沒有骰子。 「SQL錯誤:ORA-01779:無法修改映射到非密鑰保存表的列 01779. 00000 - 」無法修改映射到非密鑰保留表的列「 *原因:嘗試插入或更新連接視圖的列,其中 映射到非鍵保留表 *操作:直接修改底層基表。「 – AfterWorkGuinness