我们可以在合并中有两个匹配的子句
问题描述:
编写一个删除等级超过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。