MERGE运算能够完成的任务使用INSERT、UPDATE和DELETE语句都能完成,但它传递一次源数据,就能够实现这三种操作。没有MERGE的另一种代码要求传递三次数据,一个命令一次。
MERGE语句的源数据可以是表或者任何子查询。用于查找目标表中匹配行的条件与WHERE子句类似。更新或者插入行的子句像UPDATE或者INSERT命令一样复杂。MERGE是最复杂的DML命令(但不是不可理解),因为其功能(无可争辩)最强大。MERGE的使用不在OCP课程提纲范围之内,但出于完整性考虑,下面给出一个简单示例:
merge into employees e using new_employees n
on (e.employee_id = n.employee_id)
when matched then
update set e.salary=n.salary
when not matched then
insert (employee_id,last_name,salary)
values (n.employee_id,n.last_name,n.salary);
上面的语句使用表NEW_EMPLOYEES的内容在EMPLOYEES表中更新或者插入行。情况是EMPLOYEES是所有员工的表,NEW_EMPLOYEES表包含的行表示新员工和现有员工的薪水变化。命令会通过NEW_EMPLOYEES表,对于每一行而言,在EMPLOYEES表中查找具有相同EMPLOYEE_ID的行。如果找到这样的行,就用NEW_EMPLOYEES表中行的值更新它的SALARY列。如果没有这样的行,就插入一行。语法变体允许使用子查询来选择源行,甚至可以删除匹配行。