ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Merge用法

Merge用法

原创 Linux操作系统 作者:moran0922 时间:2011-04-21 22:52:12 0 删除 编辑
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-NONE2)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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-01-19

  • 博文量
    21
  • 访问量
    22074