2016-08-25 3 views
0

グレードが150を超えるレコードを削除するクエリを1つ作成します。レコードが存在する場合はグレードを更新し、内部に25を追加します。マージ時に一致する句が2つあります

merge into employeegrades eg 
using (select id, name from temp_emp) emp 
on (eg.id = emp.id) 
when matched and eg.grades > 150 then 
delete 
when matched 
update set eg.grades = eg.grades+25 
when not matched then 
insert (id,grades) 
values (emp.id, 25); 

と何が間違っている:レコードがこの正常に動作している25

Merge into employeegrades empg 
    using (select id, name from temp_emp) e 
    on (empg.id= e.id) 
    when matched then 
    update set empg.grades = empg.grades + 25 
    delete where empg.grades > 150 
    when not matched then insert (id,grades) values (e.id, 25); 

としてグレードに存在しませんが、私は以下のようにステートメントを変更する場合、それが動作しない場合は、レコードを挿入します上記のクエリ?マージで2つの条件を一致させることはできませんか?

答えて

1

"マージで一致条件を2つ指定できませんか?"

syntax rules in the Oracle documentation指定する2つの句:

  • merge_update_clauseアップデートを実行し、および/または既存の行
  • 新しい行の挿入を実行merge_insert_clauseに対して削除

つまり、この節はアクションの観点から定義されています彼らは、マッチしているか否かではなく、実装します。マッチしたときに挿入したり、マッチしなかったときに更新するのは意味がないからです。

したがって、WHEN MATCHED THENキーワード句は、構文が1つだけmerge_update_clauseを許可するため、MERGE文で1回しか表示できません。

関連する問題