Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35448
  • 博文数量: 21
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-04 11:14
文章分类

全部博文(21)

文章存档

2013年(21)

我的朋友

分类: Oracle

2013-08-20 16:58:44

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);


阅读(649) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~