在本教程中将学习如何使用oracle merge
语句来执行更新或基于指定条件插入数据。
oracle merge
语句从一个或多个源表中选择数据并更新或将其插入到目标表中。 merge
语句可指定一个条件来确定是更新数据还是将数据插入到目标表中。
以下说明了oracle merge
语句的语法:
merge into target_table
using source_table
on search_condition
when matched then
update set col1 = value1, col2 = value2,...
where <update_condition>
[delete where <delete_condition>]
when not matched then
insert (col1,col2,...)
values(value1,value2,...)
where <insert_condition>;
下面来仔细看看上面merge
语句的语法:
into
子句中更新或插入的目标表(target_table
)。using
子句中的数据源(source_table
)。on
子句中更新或插入的搜索条件。对于目标表中的每一行,oracle都会评估搜索条件:
true
,则oracle使用源表(source_table
)中的相应数据更新该行。false
,则oracle将源表(source_table
)中相应的行插入到目标表(target_table
)中。当想要在单个操作中组合多个insert,update和delete语句时,merge
语句变得很方便。
因为merge
是确定性语句,所以不能在同一个merge
语句中多次更新目标表的同一行。
可以将一个可选的delete where
子句添加到matched
子句中,以在合并操作之后进行清理。 delete
子句只删除目标表中与on
和delete where
子句匹配的行。
oracle merge前提条件
要执行merge
语句,必须在源表上具有insert
和update
对象权限。 如果使用delete
子句,则还必须在目标表上具有delete
对象特权。
假设有两个表:members
和member_staging
。
每当有一个新会员信息时,则插入一个新的行记录到members
表。 然后,members
表中的数据将与member_staging
表的数据合并。
以下语句用于创建members
和member_staging
表:
create table members (
member_id number primary key,
first_name varchar2(50) not null,
last_name varchar2(50) not null,
rank varchar2(20)
);
create table member_staging as
select * from members;
使用以下insert
语句将示例数据插入到members
和member_staging
表中:
-- insert into members table
insert into members(member_id, first_name, last_name, rank) values(1,'abel','wolf','gold');
insert into members(member_id, first_name, last_name, rank) values(2,'clarita','franco','platinum');
insert into members(member_id, first_name, last_name, rank) values(3,'darryl','giles','silver');
insert into members(member_id, first_name, last_name, rank) values(4,'dorthea','suarez','silver');
insert into members(member_id, first_name, last_name, rank) values(5,'katrina','wheeler','silver');
insert into members(member_id, first_name, last_name, rank) values(6,'lilian','garza','silver');
insert into members(member_id, first_name, last_name, rank) values(7,'ossie','summers','gold');
insert into members(member_id, first_name, last_name, rank) values(8,'paige','mcfarland','platinum');
insert into members(member_id, first_name, last_name, rank) values(9,'ronna','britt','platinum');
insert into members(member_id, first_name, last_name, rank) values(10,'tressie','short','bronze');
-- insert into member_staging table
insert into member_staging(member_id, first_name, last_name, rank) values(1,'abel','wolf','silver');
insert into member_staging(member_id, first_name, last_name, rank) values(2,'clarita','franco','platinum');
insert into member_staging(member_id, first_name, last_name, rank) values(3,'darryl','giles','bronze');
insert into member_staging(member_id, first_name, last_name, rank) values(4,'dorthea','gate','gold');
insert into member_staging(member_id, first_name, last_name, rank) values(5,'katrina','wheeler','silver');
insert into member_staging(member_id, first_name, last_name, rank) values(6,'lilian','stark','silver');
将members
表中的数据更新到member_staging
表时,应该执行以下操作:
id
为1
,3
,4
和6
的行记录,因为表中这些成员的排名或姓氏是不同的。id
为7
到10
的行记录,这是因为这些行存在于members
表中,但不存在于member_staging
表中。总共有8
行数据需要合并。参考以下图示 -
以下是一次性执行所有这些操作的merge
语句。
merge into member_staging x
using (select member_id, first_name, last_name, rank from members) y
on (x.member_id = y.member_id)
when matched then
update set x.first_name = y.first_name,
x.last_name = y.last_name,
x.rank = y.rank
where x.first_name <> y.first_name or
x.last_name <> y.last_name or
x.rank <> y.rank
when not matched then
insert(x.member_id, x.first_name, x.last_name, x.rank)
values(y.member_id, y.first_name, y.last_name, y.rank);
merge
语句根据member_id
列中的值(参见上面的on
子句),将member
表中的每一行与member_staging
表中的每一行进行比较。
如果两个表的member_id
列中的值相等,merge
语句只有在两个表的first_name
,last_name
或rank
列的不值时,才将members
表中的first_name
,last_name
或rank
列的不值作为member_staging
对应列的值来更新,否则它将members
的行直接插入member_staging
表。
oracle按照预期返回了8
行合并数据。
在本教程中,您已学习如何使用oracle merge
语句根据指定的条件更新或插入数据。