merge into

merge into:

作用:merge into 解决用B表更新A表数据,如果A表中没有,则把B表的数据插入A表;

语法:

MERGE INTO [your table-name] [rename your table here]

USING ( [write your query here] )[rename your query-sql and using just like a table]

ON ([conditional expression here] AND [...]...)

WHEN MATHED THEN [here you can execute some update sql or something else ]

WHEN NOT MATHED THEN [execute something else here ! ]

-------------------------------------实例-----------------------------------------------------------------
建表:
create table b1_test (sales varchar(20),dest varchar(20),revenue number,deparment varchar(20)) ;
insert into b1_test values('smith','hangzhou',1000,'008');
insert into b1_test values('allen','beijing',5000,'03');
insert into b1_test values('allen','shanghai',4000,'002');
insert into b1_test values('Jay','shanghai',6000,'01');
insert into b1_test values('smith','hangzhou',1000,'008');

create table b2_test as select * from b_test ;
insert into b2_test values('smith','HZ',1000,'008');
insert into b2_test values('allen','SH',4000,'002');
insert into b2_test values('Jay Chou','TW',6000,'007');
insert into b2_test values('Bruce Lee','HK',8000,'008');

 


merge into b1_test  a using (select sales,dest,revenue,deparment
from b2_test ) b
on (a.sales=b.sales /*and a.dest=b.dest and a.revenue=b.revenue*/ /*and a.deparment=b.deparment*/ )
when matched then update set a.dest=b.dest
when not matched then insert (a.sales,a.dest,a.revenue,a.deparment)
values (b.sales,b.dest,b.revenue,b.deparment )  ;

注:两表必须是已经建好存在的,并且要更新字段类型一致

作用:利用表 bb_test更新表b_test 的b.dest,条件是a.sales=b.sales,如果test表中没有该条件的数据就插入。

如果你的数据量很大,此sql效率非常高。


Merge 命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于ON子句的条件。
该语句可以在同一语句中执行两步操作,可以减少执行多条INSERT 和UPDATE语句。
MERGE是一个确定性的语句,即不会在同一条MERGE语句中去对同一条记录多次做修改操作。

MERGE INTO  要合并的表/视图
USING   要更新或插入的数据源
ON   语句进行插入或更新的条件
WHEN MATCHED THEN UPDATE  要更新的列
WHEN NOT MATCHED THEN INSERT  要插入的列

 

http://www.oratea.cn/2008/07/30/178.html

ora-30926
7月 30, 2008 – 11:24 上午
在使用merge更新数据的时候,有时会遇到ora-30926的错误。一般就是源表中存在重复记录,导致不能正确的进行更新操作。

SQL>create table sunwg1 (id number,name varchar2(10));

SQL>create table sunwg2 (id number,name varchar2(10));

SQL>insert into sunwg1 values(1,’a');

SQL>commit;

提交完成。

SQL>insert into sunwg2 values(1,’aa’);

SQL>insert into sunwg2 values(1,’bb’);

SQL>commit;

提交完成。

SQL> MERGE INTO sunwg1 a
  2     USING sunwg2 b
  3           ON (a.id = b.id )
  4          WHEN MATCHED THEN UPDATE
  5             SET a.name = b.name;
        USING sunwg2 b
              *
第 2 行出现错误:
ORA-30926: 无法在源表中获得一组稳定的行

这个时候由于表sunwg2中对于id来说存在重复记录,所以更新会出错。
但是反过来由于表sunwg1中没有重复记录,merge是可以成功的。

SQL> MERGE INTO sunwg2 a
  2     USING sunwg1 b
  3           ON (a.id = b.id )
  4          WHEN MATCHED THEN UPDATE
  5             SET a.name = b.name;

2 行已合并。

SQL> commit;

提交完成。

 

报表函数:
avgAll(fieldIDExp [,rowCndExp])
作用:取所有满足条件的记录中指定数据列的平均值
repCnd(条件标识)
作用:取当前报表条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值