现在的位置: 首页 > 综合 > 正文

merge into

2013年10月21日 ⁄ 综合 ⁄ 共 2546字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.