我们可以在合并中有两个匹配的子句

问题描述:

编写一个删除等级超过150的记录的查询。如果记录存在,则更新成绩并为每个成员添加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); 

这是工作正常,但当我修改如下的声明,它不工作:

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); 

什么是错用以上查询?我们不能在合并中指定两个匹配的条件吗?

“我们不能在合并中指定两个匹配条件吗?”

syntax rules in the Oracle documentation指定两个子句:

  • merge_update_clause其执行的更新和/或删除针对现有行
  • merge_insert_clause,其执行的新行的插入

也就是说,这些条款是根据行为来定义的他们执行,而不是他们是否匹配或不匹配。因为在MATCHED时插入或在未匹配时更新是没有意义的。

因此,WHEN MATCHED THEN关键字短语只能在MERGE语句中出现一次,因为语法只允许一个merge_update_clause