- 浏览: 211107 次
- 性别:
- 来自: 广州
文章分类
最新评论
转自:http://blog.csdn.net/EdgenHuang/article/details/3587912
Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.
Oracle 10g中MERGE有如下一些改进:
1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
首先创建示例表:
create table PRODUCTS ( PRODUCT_ID INTEGER, PRODUCT_NAME VARCHAR2(60), CATEGORY VARCHAR2(60) ); insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS'); insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS'); insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS'); insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS'); insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD'); commit; create table NEWPRODUCTS ( PRODUCT_ID INTEGER, PRODUCT_NAME VARCHAR2(60), CATEGORY VARCHAR2(60) ); insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS'); insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS'); insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS'); insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS'); commit; |
1、可省略的UPDATE或INSERT子句
在Oracle 9i, MERGE语句要求你必须同时指定INSERT和UPDATE子句.而在Oracle 10g, 你可以省略UPDATE或INSERT子句中的一个. 下面的例子根据表NEWPRODUCTS的PRODUCT_ID字段是否匹配来updates表PRODUCTS的信息:
SQL> MERGE INTO products p 2 USING newproducts np 3 ON (p.product_id = np.product_id) 4 WHEN MATCHED THEN 5 UPDATE 6 SET p.product_name = np.product_name, 7 p.category = np.category; 3 rows merged. SQL> SELECT * FROM products; PRODUCT_ID PRODUCT_NAME CATEGORY ---------- -------------------- ---------- 1501 VIVITAR 35MM ELECTRNCS 1502 OLYMPUS CAMERA ELECTRNCS 1600 PLAY GYM TOYS 1601 LAMAZE TOYS 1666 HARRY POTTER TOYS SQL> SQL> ROLLBACK; Rollback complete. SQL> |
在上面例子中, MERGE语句影响到是产品id为1502, 1601和1666的行. 它们的产品名字和种 类被更新为表newproducts中的值. 下面例子省略UPDATE子句, 把表NEWPRODUCTS中新的PRODUCT_ID插入到表PRODUCTS中, 对于在两个表中能够匹配上PRODUCT_ID的数据不作任何处理. 从这个例子你能看到PRODUCT_ID=1700的行被插入到表PRODUCTS中.
SQL> MERGE INTO products p 2 USING newproducts np 3 ON (p.product_id = np.product_id) 4 WHEN NOT MATCHED THEN 5 INSERT 6 VALUES (np.product_id, np.product_name, 7 np.category); 1 row merged. SQL> SELECT * FROM products; PRODUCT_ID PRODUCT_NAME CATEGORY ---------- -------------------- ---------- 1501 VIVITAR 35MM ELECTRNCS 1502 OLYMPUS IS50 ELECTRNCS 1600 PLAY GYM TOYS 1601 LAMAZE TOYS 1666 HARRY POTTER DVD 1700 WAIT INTERFACE BOOKS |
2、带条件的Updates和Inserts子句
你能够添加WHERE子句到UPDATE或INSERT子句中去, 来跳过update或insert操作对某些行的处理. 下面例子根据表NEWPRODUCTS来更新表PRODUCTS数据, 但必须字段CATEGORY也得同时匹配上:
SQL> MERGE INTO products p 2 USING newproducts np 3 ON (p.product_id = np.product_id) 4 WHEN MATCHED THEN 5 UPDATE 6 SET p.product_name = np.product_name 7 WHERE p.category = np.category; 2 rows merged. SQL> SELECT * FROM products; PRODUCT_ID PRODUCT_NAME CATEGORY ---------- -------------------- ---------- 1501 VIVITAR 35MM ELECTRNCS 1502 OLYMPUS CAMERA ELECTRNCS 1600 PLAY GYM TOYS 1601 LAMAZE TOYS 1666 HARRY POTTER DVD SQL> SQL> rollback; |
在这个例子中, 产品ID为1502,1601和1666匹配ON条件但是1666的category不匹配. 因此MERGE命令只更新两行数据. 下面例子展示了在Updates和Inserts子句都使用WHERE子句:
SQL> MERGE INTO products p 2 USING newproducts np 3 ON (p.product_id = np.product_id) 4 WHEN MATCHED THEN 5 UPDATE 6 SET p.product_name = np.product_name, 7 p.category = np.category 8 WHERE p.category = 'DVD' 9 WHEN NOT MATCHED THEN 10 INSERT 11 VALUES (np.product_id, np.product_name, np.category) 12 WHERE np.category != 'BOOKS' SQL> / 1 row merged. SQL> SELECT * FROM products; PRODUCT_ID PRODUCT_NAME CATEGORY ---------- -------------------- ---------- 1501 VIVITAR 35MM ELECTRNCS 1502 OLYMPUS IS50 ELECTRNCS 1600 PLAY GYM TOYS 1601 LAMAZE TOYS 1666 HARRY POTTER TOYS SQL> |
注意由于有WHERE子句INSERT没有插入所有不匹配ON条件的行到表PRODUCTS.
3、无条件的Inserts
你能够不用连接源表和目标表就把源表的数据插入到目标表中. 这对于你想插入所有行到目标表时是非常有用的. Oracle 10g现在支持在ON条件中使用常量过滤谓词. 举个常量过滤谓词例子ON (1=0). 下面例子从源表插入行到表PRODUCTS, 不检查这些行是否在表PRODUCTS中存在:
SQL> MERGE INTO products p 2 USING newproducts np 3 ON (1=0) 4 WHEN NOT MATCHED THEN 5 INSERT 6 VALUES (np.product_id, np.product_name, np.category) 7 WHERE np.category = 'BOOKS' SQL> / 1 row merged. SQL> SELECT * FROM products; PRODUCT_ID PRODUCT_NAME CATEGORY ---------- -------------------- ---------- 1501 VIVITAR 35MM ELECTRNCS 1502 OLYMPUS IS50 ELECTRNCS 1600 PLAY GYM TOYS 1601 LAMAZE TOYS 1666 HARRY POTTER DVD 1700 WAIT INTERFACE BOOKS 6 rows selected. SQL> |
4、新增加的DELETE子句
Oracle 10g中的MERGE提供了在执行数据操作时清除行的选项. 你能够在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. DELETE子句必须有一个WHERE条件来删除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中删除.
下面例子验证DELETE子句. 我们从表NEWPRODUCTS中合并行到表PRODUCTS中, 但删除category为ELECTRNCS的行.
SQL> MERGE INTO products p 2 USING newproducts np 3 ON (p.product_id = np.product_id) 4 WHEN MATCHED THEN 5 UPDATE 6 SET p.product_name = np.product_name, 7 p.category = np.category 8 DELETE WHERE (p.category = 'ELECTRNCS') 9 WHEN NOT MATCHED THEN 10 INSERT 11 VALUES (np.product_id, np.product_name, np.category) SQL> / 4 rows merged. SQL> SELECT * FROM products; PRODUCT_ID PRODUCT_NAME CATEGORY ---------- -------------------- ---------- 1501 VIVITAR 35MM ELECTRNCS 1600 PLAY GYM TOYS 1601 LAMAZE TOYS 1666 HARRY POTTER TOYS 1700 WAIT INTERFACE BOOKS SQL> |
产品ID为1502的行从表PRODUCTS中被删除, 因为它同时匹配ON条件和DELETE WHERE条件. 产品ID为1501的行匹配DELETE WHERE条件但不匹配ON条件, 所以它没有被删除. 产品ID为1700 的行不匹配ON条件, 所以被插入表PRODUCTS. 产品ID为1601和1666的行匹配ON条件但不匹配DELETE WHERE条件, 所以被更新为表NEWPRODUCTS中的值.
转自:http://database.51cto.com/art/201004/196706.htm
Oracle merge into用法以及相关例子示例
我们今天主要介绍的是Oracle merge into用法以及相关例子,本文还涉及到其在实际操作中的相关语法的示例,望你在浏览之后会有所收获。
AD:
以下的文章主要是对Oracle merge into用法以及相关例子的介绍,首先我们以Oracle 9I中加入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;
创建测试数据表:
- create table tj_test(id number,name varchar2(20),age number);
向表中插入数据:
- insert into tj_test values (1,'jan',23);
- insert into tj_test values (2,'kk',22);
- insert into tj_test values (3,'joe',27);
- select * from tj_test;
查询结果如下:
1 jan 23
2 kk 22
3 joe 27
创建另一新表
- create table tj_test1 as select * from tj_test where 1=0
插入一条数据
- insert into tj_test1 values (1,'jlk',23);
- select * from tj_test1
查询结果如下:
1 jkl 23 --注意,这里的的NAME字段中的值是jkl
Oracle merge into用法使用MERGE,实现有则更新,无则插入,sql语句如下:
- merge into tj_test1 tt1
- using tj_test tt
- on (tttt1.id=tt.id)
- when matched then
- update set
- tttt1.name=tt.name,
- tttt1.age=tt.age
- when not matched then
- insert values(
- tt.id,
- tt.name,
- tt.age)
查询tj_test1表(对比原来表中的数据,更新了ID=1 ROW中字段NAME,同时多出两条新数据)
- select * from tj_test1
改变行数据如下:
1 jan 23 --这里的原有jkl值被更新
3 joe 27 --原来表中没有的插入
2 kk 22 --原来表中没有的插入
如果存在就更新,不存在就插入
9i已经支持了,是Merge,但是只支持select子查询,
如果是单条数据记录,可以写作select …… from dual的子查询。
语法为:
- MERGE INTO table
- USING data_source
- ON (condition)
- WHEN MATCHED THEN update_clause
- WHEN NOT MATCHED THEN insert_clause;
如:
- MERGE INTO course c
- USING (SELECT course_name, period,
- course_hours
- FROM course_updates) cu
- ON (c.course_name = cu.course_name
- AND c.period = cu.period)
- WHEN MATCHED THEN
- UPDATE
- SET c.course_hours = cu.course_hours
- WHEN NOT MATCHED THEN
- INSERT (c.course_name, c.period,
- c.course_hours)
- VALUES (cu.course_name, cu.period,
- cu.course_hours);
以上的相关内容就是对Oracle merge into用法及例子的介绍,望你能有所收获。
发表评论
-
(转)Oraclepl/sql中实现continue的方法
2013-10-21 11:36 1059转自:http://blog.csdn.net/wzy06 ... -
用pl/sql developer导出表结构和数据
2013-08-08 15:12 698转自:http://blog.csdn.net/ ... -
Oracle 中like效率 正则表达式 浅析
2013-07-19 11:47 920转自:http://blog.csdn.net/songde ... -
ORACLE EXPDP命令使用详细
2013-07-17 15:52 648转自:http://blog.csdn.net/zftang ... -
Oracle11g使用exp导出空表
2013-07-17 15:50 977转自:http://www.cnblogs.co ... -
oracle 汉字转拼音函数
2013-07-02 15:31 2958oracle 汉字转拼音函数 google 转自:ht ... -
(转)oracle恢复误删除数据,解除锁定的等sql语句
2013-05-03 15:20 1113注意:数据库版本是10g,不过大部分9i的也适用,闪回9i就 ... -
(转)oracle wm_concat(column)函数的使用
2013-05-03 15:17 658oracle wm_concat(column)函数的使用 ... -
(转)Oracle 10g如何对用户姓名,按首字母排序、查询
2013-05-03 15:16 877http://zheng12tian.iteye.com/b ... -
(转)oracle.for update,更新游标,cursor
2013-05-03 13:10 4044http://blog.csdn.net/yanleigis ... -
(转)oracle for update和for update nowait的区别
2013-05-03 11:29 771转自:http://www.cnblogs.com/quan ... -
(转)Oracle存储过程异常处理事务特性分析
2013-04-27 23:08 704Oracle存储过程中的事务是如何处理的?通常情况下。整个 ... -
(转)oracle 存储过程事务使用断点回滚 ---savepoint
2013-04-27 21:25 3708学习存储过程中使用断点回滚事务时,发现目前网络上存在一个问题 ... -
(转)oracle存储过程的事务处理及事务使用断点回滚
2013-04-27 21:01 11831、事务用于确保数据的一致性,由一组相关的DML语句组成,该 ... -
Oracle 修改字段类型
2013-03-22 11:24 8091,如果只是单纯的把字段改大,比如numeric (16,2 ... -
(转)在Oracle 数据库中的临时表用法汇总
2013-03-07 10:04 16441 语法 在Oracle中,可以创建以下两种临时表 ... -
(转)PL/SQL Developer 使用笔记
2013-03-06 11:34 801PL/SQL Developer 使用笔记 版本: ... -
(转)Oracle 临时表的应用
2013-03-06 11:14 799http://hi.baidu.com/edeed/item ... -
(转)Oracle临时表使用注意事项
2013-03-06 11:04 1306http://space.itpub.net/519536/ ... -
(转)decode中null相等
2013-03-06 11:02 879SQL> select decode(null,nul ...
相关推荐
关于Oracle中merge into的用法,比较实用哦
oracle merge 用法详解
oracle merge into的使用,开发必备的。
Oracle中merge into的使用 很有用的哦 学习一下
Mybatis批量foreach merge into的用法,这是介绍Mybatis批量foreach merge into的用法的文档
Merge into写法,含两种,带实例说明
浅谈Oracle数据库中Merge Into的用法.pdf
在任何数据库中发生死锁都是不愉快的,即使是在一个特殊的情况下发生也是如此,它们会减小应用程序的接受程度(ACCEPTANCE),因此避免并正确解释死锁是非常重要的。
主要介绍了oracle中merge into用法及实例解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 ...
非常经典的SQL经验,适合于数据库初学者及长期从事软件开发者
主要介绍了oracle数据匹配merge into的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次...
oracle Merge 函数
详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询
merge 详解 及实例 优点: — 避免了分开更新 — 提高性能并易于使用 — 在数据仓库应用中十分有用 — 使用merge比传统的先判断再选择插入或更新快很多
DB2中的Merge语句可以将一个表中的数据合并到另一个表中,在合并的同时可以根据条件进行插入、删除、更新等操作,功能非常强大。