- 浏览: 209924 次
- 性别:
- 来自: 广州
文章分类
最新评论
转自:http://xo-tobacoo.iteye.com/blog/182791
总结下。使用merge比传统的先判断再选择插入或更新快很多。
1)主要功能
提供有条件地更新和插入数据到数据库表中
如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作
— 避免了分开更新
— 提高性能并易于使用
— 在数据仓库应用中十分有用
2)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;
还是看例子就知道怎么回事:
MERGE INTO copy_emp c
USING employees e
ON (c.employee_id=e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name=e.first_name,
c.last_name=e.last_name,
c.department_id=e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id,e.first_name,e.last_name,
e.email,e.phone_number,e.hire_date,e.job_id,
e.salary,e.commission_pct,e.manager_id,
e.departmetn_id);
MERGE INTO copy_emp c
USING employees e
ON (c.employee_id=e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name=e.first_name,
c.last_name=e.last_name,
c.department_id=e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id,e.first_name,e.last_name,
e.email,e.phone_number,e.hire_date,e.job_id,
e.salary,e.commission_pct,e.manager_id,
e.departmetn_id);
3)使用merge的注意事项:
创建测试表:
CREATE TABLE MM (ID NUMBER, NAME VARCHAR2(20));
CREATE TABLE MN (ID NUMBER, NAME VARCHAR2(20));
插入数据
INSERT INTO MM VALUES (1, 'A');
INSERT INTO MN VALUES (1, 'B');
执行:
MERGE INTO MN A
USING MM B
ON(A.ID=B.ID)
WHEN MATCHED THEN
UPDATE SET A.ID = B.ID
WHEN NOT MATCHED THEN
INSERT VALUES(B.ID, B.NAME);
ON(A.ID=B.ID)
报错,原因是on子句的使用的字段不能够用于update,即Oracle不允许更新用于连接的列
修改:
MERGE INTO MN A
USING MM B
ON(A.ID=B.ID)
WHEN MATCHED THEN
UPDATE SET A.NAME = B.NAME
WHEN NOT MATCHED THEN
INSERT VALUES(B.ID, B.NAME);
ON(A.ID=B.ID)
再插入:INSERT INTO MM VALUES (1, 'C');
再执行:
MERGE INTO MN A
USING MM B
ON(A.ID=B.ID)
WHEN MATCHED THEN
UPDATE SET A.NAME = B.NAME
WHEN NOT MATCHED THEN
INSERT VALUES(B.ID, B.NAME);
ON(A.ID=B.ID)
报错,原因无法在源表中获得一组稳定的行
4)更新同一张表的数据。需要注意下细节,因为可能涉及到using的数据集为null,所以要使用count()函数。
MERGE INTO mn a
USING (select count(*) co from mn where mn.ID=4) b
ON (b.co<>0)--这里使用了count和<>,注意下,想下为什么!
WHEN MATCHED THEN
UPDATE
SET a.NAME = 'E'
where a.ID=4
WHEN NOT MATCHED THEN
INSERT
VALUES (4, 'E');
------------------------------------------------------------------------------------------------------
转自:http://chenxy.blog.51cto.com/729966/823342
Merge into 详细介绍
MERGE语句是 oracle 9i 新增的语法,用来合并 UPDATE 和 INSERT 语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
drop table t;
CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A;
drop table t1;
CREATE TABLE T1 AS
SELECT ROWNUM ID, OWNER, TABLE_NAME, CAST('TABLE' AS VARCHAR2(100)) OBJECT_TYPE FROM DBA_TABLES;
MERGE INTO T1 USING T
ON (T.OWNER = T1.OWNER AND T.OBJECT_NAME = T1.TABLE_NAME AND T.OBJECT_TYPE = T1.OBJECT_TYPE)
WHEN MATCHED THEN UPDATE SET T1.ID = T.ID
WHEN NOT MATCHED THEN INSERT VALUES (T.ID, T.OWNER, T.OBJECT_NAME, T.OBJECT_TYPE);
--insert后面不写表示插入全部列
MERGE INTO T1 USING T
ON (T.OWNER = T1.OWNER AND T.OBJECT_NAME = T1.TABLE_NAME)
WHEN MATCHED THEN UPDATE SET T1.ID = T.ID
WHEN NOT MATCHED THEN INSERT VALUES (T.ID, T.OWNER, T.OBJECT_NAME, T.OBJECT_TYPE);
--常见错误,连接条件不能获得稳定的行,可以使用下面的用子查询
MERGE INTO T1
USING (SELECT OWNER, OBJECT_NAME, MAX(ID) ID FROM T GROUP BY OWNER, OBJECT_NAME) T
ON (T.OWNER = T1.OWNER AND T.OBJECT_NAME = T1.TABLE_NAME)
WHEN MATCHED THEN UPDATE SET T1.ID = T.ID
WHEN NOT MATCHED THEN INSERT VALUES (T.ID, T.OWNER, T.OBJECT_NAME);
SELECT ID, OWNER, OBJECT_NAME, OBJECT_TYPE FROM T
MINUS
SELECT * FROM T1;
drop table subs;
create table subs(
msid number(9),
ms_type char(1),
areacode number(3)
);
drop table acct;
create table acct(
msid number(9),
bill_month number(6),
areacode number(3),
fee number(8,2) default 0.00
);
insert into subs values(905310001,0,531);
insert into subs values(905320001,1,532);
insert into subs values(905330001,2,533);
commit;
merge into acct a --操作的表
using subs b on (a.msid=b.msid) --使用原始数据来源的表,并且制定条件,条件必须有括号
when matched then
update set a.areacode=b.areacode
--当匹配的时候,执行update操作,和直接update的语法不一样,不需要制定表名
when not matched then
--当不匹配的时候,执行insert操作,也不需要制定表名,若指定字段插入,
--则在insert后用括号标明,不指定是全部插入
insert(msid,bill_month,areacode) values(b.msid,'200702',b.areacode);
--另外,MERGE语句的UPDATE不能修改用于连接的列,否则会报错
select * from acct;
select * from subs;
--10g新特性,单个操作
merge into acct a
using subs b on(a.msid=b.msid)
when not matched then
--只有单个not matched的时候,只做插入,不做更新,只有单个matched的时候,只做更新操作
insert(a.msid,a.bill_month,a.areacode) values(b.msid,'200702',b.areacode);
update acct set areacode=800 where msid=905320001;
delete from acct where areacode=533 or areacode=531;
insert into acct values(905320001,'200702',800,0.00);
--删除重复行
delete from subs b where b.rowid<(
select max(a.rowid)
from subs a
where a.msid=b.msid and a.ms_type=b.ms_type and a.areacode=b.areacode);
--10g新特性,merge操作之后,只有匹配的update操作才可以,
--用delete where子句删除目标表中满足条件的行。
merge into acct a
using subs b on (a.msid=b.msid)
when MATCHED then
update set a.areacode=b.areacode
delete where (b.ms_type!=0)
when NOT MATCHED then
insert(msid,bill_month,areacode)
values(b.msid,'200702',b.areacode)
where b.ms_type=0;
--10g新特性,满足条件的插入和更新
merge into acct a
using subs b on (a.msid=b.msid)
when MATCHED then
update set a.areacode=b.areacode
where b.ms_type=0
when NOT MATCHED then
insert(msid,bill_month,areacode)
values(b.msid,'200702',b.areacode)
where b.ms_type=0;
select * from subs where ms_type=0;
发表评论
-
(转)Oraclepl/sql中实现continue的方法
2013-10-21 11:36 1049转自:http://blog.csdn.net/wzy06 ... -
用pl/sql developer导出表结构和数据
2013-08-08 15:12 691转自:http://blog.csdn.net/ ... -
Oracle 中like效率 正则表达式 浅析
2013-07-19 11:47 909转自:http://blog.csdn.net/songde ... -
ORACLE EXPDP命令使用详细
2013-07-17 15:52 639转自:http://blog.csdn.net/zftang ... -
Oracle11g使用exp导出空表
2013-07-17 15:50 965转自:http://www.cnblogs.co ... -
oracle 汉字转拼音函数
2013-07-02 15:31 2947oracle 汉字转拼音函数 google 转自:ht ... -
(转)oracle恢复误删除数据,解除锁定的等sql语句
2013-05-03 15:20 1103注意:数据库版本是10g,不过大部分9i的也适用,闪回9i就 ... -
(转)oracle wm_concat(column)函数的使用
2013-05-03 15:17 651oracle wm_concat(column)函数的使用 ... -
(转)Oracle 10g如何对用户姓名,按首字母排序、查询
2013-05-03 15:16 861http://zheng12tian.iteye.com/b ... -
(转)oracle.for update,更新游标,cursor
2013-05-03 13:10 4029http://blog.csdn.net/yanleigis ... -
(转)oracle for update和for update nowait的区别
2013-05-03 11:29 759转自:http://www.cnblogs.com/quan ... -
(转)Oracle存储过程异常处理事务特性分析
2013-04-27 23:08 696Oracle存储过程中的事务是如何处理的?通常情况下。整个 ... -
(转)oracle 存储过程事务使用断点回滚 ---savepoint
2013-04-27 21:25 3693学习存储过程中使用断点回滚事务时,发现目前网络上存在一个问题 ... -
(转)oracle存储过程的事务处理及事务使用断点回滚
2013-04-27 21:01 11741、事务用于确保数据的一致性,由一组相关的DML语句组成,该 ... -
Oracle 修改字段类型
2013-03-22 11:24 7971,如果只是单纯的把字段改大,比如numeric (16,2 ... -
(转)在Oracle 数据库中的临时表用法汇总
2013-03-07 10:04 16331 语法 在Oracle中,可以创建以下两种临时表 ... -
(转)PL/SQL Developer 使用笔记
2013-03-06 11:34 790PL/SQL Developer 使用笔记 版本: ... -
(转)Oracle 临时表的应用
2013-03-06 11:14 788http://hi.baidu.com/edeed/item ... -
(转)Oracle临时表使用注意事项
2013-03-06 11:04 1293http://space.itpub.net/519536/ ... -
(转)decode中null相等
2013-03-06 11:02 869SQL> select decode(null,nul ...
相关推荐
oracle使用 merge 更新或插入数据(总结@新
主要介绍了在MySQL中实现插入或更新操作(类似Oracle的merge语句)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
在Oracle 9i R2版中引入的MERGE语句通常被称作“更新插入”(upsert),因为使用MERGE可以在同一个步骤中更新(update)并插入(insert)数据行。。。。。。
merge 详解 及实例 优点: — 避免了分开更新 — 提高性能并易于使用 — 在数据仓库应用中十分有用 — 使用merge比传统的先判断再选择插入或更新快很多
1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作 — 避免了分开更新 — 提高性能并易于使用 — 在数据仓库应用中十分有用 2)MERGE语句的...
一个简单的实用程序 PL/SQL 包,允许对 Oracle 中的合并操作插入/更新/删除的行进行计数。 包的需要 Oracle不提供获取行数的功能。 插入 更新 已删除 使用 MERGE 操作完成所有操作时。 这个简单的实用程序是为了...
作用:判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表但是有很多可选项,如下: 1.正常模式 2.只update或者只insert 3.带条件的update或带条件的insert 4.
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...
《Oracle SQL高级编程》:资深Oracle专家力作,OakTable团队推荐,全面、独到、翔实,题材丰富,Oracle开发人员和DBA必备。 媒体推荐 本书作者全部是OakTable的成员,且具有15-29年丰富的Oracle开发经验。在研究...
达梦数据库sql语言手册,达梦数据库是国产数据库里最好使用的,可以跟oracle数据无缝替换的
1.2.1.6.2 使用IS NULL 或IS NOT NULL ......30 1.2.1.6.3 使用函数.........30 1.2.1.6.4 比较不匹配的数据类型...............30 1.2.1.7 查询索引..................30 1.2.1.8 组合索引..............
3、数字和日期都可以使用数学运算符建立表达式。 ...............................................................9 4、定义空(NULL)值 ....................................................................
sql> alter index xay_id allocate extent(size 200k datafile \'c:/oracle/index.dbf\'); <8>.alter index xay_id deallocate unused; 、查看索引 SQL>select index_name,index_type,table_name from user...
7.1 使用同等连接和非同等连接编写SEIECT语句访问多个表的数据 7.1.1 连接的类型 7.1.2 使用SQL:1999语法连接表 7.1.3 限定模糊的列名 7.1.4 NATURALJOIN子句 7.1.5 自然JOINUSING子句 7.1.6 自然JOIN...
1.2.1.6.2 使用 IS NULL 或 IS NOT NULL ............................................................... 1.2.1.6.3 使用函数 ..................................................................................
7. tablespace 表空间:一个或多个数据文件的逻辑组成。 ..... 8. redo log file 重做日志文件............................. 9. control file 控制文件 ................................. 10. parameter file 初始...
别名是一个SQL功能,他允许你在一个查询中为表格或专栏创建一个速记符号,他在处理自连接时也可以很便利地使用,这一点我会在后面提到。 一个别名通用的格式是table_name.column_name AS alias,他允许你通过指派的...