Merge用法

1.Merge语法:
MERGE [hint] INTO [schema .] table [t_alias]
USING
[schema .] { table | view | subquery } [t_alias]
ON
( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE
2.merge可使用子句
update/insert/delete,三个子句可单独使用,也可混用,如'
create table t1(name varchar2(10), amount number(12));
create table t2(name varchar2(10), amount number(12));

insert into t1 values ('a',100);
insert into t1 values ('b',200);
insert into t2 values ('a',30);
insert into t2 values ('c',40);
commit;

merge into t2
using t1
on (t1.name=t2.name)
when matched then
update set t2.amount=t1.amount+t2.amount
when not matched then
insert values(t1.name,t1.amount)
delete where (t2.name='a');

3. merge可加where条件语句,也可加delete子句,其中delete where子句必须放在最后

4. merge常见错误

1) 无法在源表中获取一组稳定的行,MERGE INTO T2 USING T1 ON...的MERGE表达式中,如果一条T2记录被连接到多条T1记录,就产生了ORA-30926错误,故源表T1在on条件上取得的记录必须是唯一的,但目标表可有多条对应记录,且多行均被修改。

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 2)merge做delete时只能删除目标表,不能删除源表,不管delete where条件是目标表的列还是源表的列,最终都删除对应的目标表记录。

3)using条件子句是空值的情况:

-- 在t2不存在name='d'的数据时,下列语句并不会更新t2,因t中并没有记录!
merge into t2
using (select * from t2 where name='d') t 
on (t.name=t2.name)
when matched then
update set t2.amount=100
when not matched then
insert values ('d',200);
-- 可改写成如下:
merge into t2
using (select count(*) cnt from t2 where name='d') t
on (t.cnt<>0)
when matched then
update set t2.amount=100
when not matched then
insert values ('d',100);


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16210564/viewspace-693123/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16210564/viewspace-693123/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值