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(条件标识)
作用:取当前报表条件