2011-10-25 23 views
3

私はORA-38104: Columns referenced in the ON clause cannot be updatedを取得し、このマージ時にORA-3814エラーを回避するにはどうすればよいですか?

MERGE INTO target_table tgt 
USING source_table src 
on(tgt.c1=src.c1) 
WHEN MATCHED THEN 
UPDATE SET tgt.c1=src.c2 

のようなコードを持っています。私はこのエラーの理由を理解しています。しかし、このコードをどのように書き直すことができますか?カーソルを使わずに可能性はありますか?これについて

答えて

11

どのように、外側には、私は `このエラーを取得していridはnullになり、したがって、失敗し、あなたは1

MERGE INTO target_table tgt 
USING (SELECT t2.ROWID AS rid 
      , s2.c2 
     FROM target_table t2 
      , source_table s2 
     WHERE t2.c1 (+) = s2.c1 
    ) src 
ON (tgt.rowid = src.rid) 
WHEN MATCHED THEN 
UPDATE SET tgt.c1=src.c2 
+0

を持っている場合、ステートメントのWHEN NOT MATCHED一部に流入することを意味し参加ORA- 01445:キー保存表なしで結合ビューからROWIDを選択できません原因:SELECT文は、結合操作から派生したビューからROWIDを選択しようとしました。ビューで選択された行は、基礎となる物理レコードに対応していないため、ROWIDは返されません。 '私がこのクエリを使用する場合 – Vivek

+1

あなたは少し違う何かをする必要があります。あなたは 't2.ROWID AS something 'を持っていますか? 'src.ROWID'を使用することは有効ではありません。それはなぜ私が' AS rid'をエイリアス化したのかです。 – Sodved

+0

はい、あなたは正しいです。私は 't2.ROWID'の名前を' rid'と改名していませんでした。エイリアス名を追加すると正常に動作します。ありがとうSodved :) – Vivek

関連する問題