Oracle在9i引入了merge命令,
通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表
语法如下
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 ! ]
我们先看看一个简单的例子,来介绍一个merge into的用法
merge into products p using newproducts np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
在这个例子里。前面的merger into products using newproducts 表示的用newproducts表来merge到products表,merge的匹配关系就是on后面的条件子句的内容,这里根据两个表的product_id来进行匹配,那么匹配上了我们的操作是就是when matched then的子句里的动作了,这里的动作是update set p.product_name = np.product_name, 很显然就是把newproduct里的内容,赋值到product的product_name里。如果没有匹配上则insert这样的一条语句进去。 大家看看这个merget inot的用法是不是一目了然了呀。这里merger的功能,好比比较,然后选择更新或者是插入,是一系列的组合拳,在做merge的时候,这样同样的情况下,merge的性能是优于同等功能的update/insert语句的。有人曾经分析merge是批量处理对性能贡献很大,个人觉得这个是没有考据的。
我们也可以在using后面使用视图或者子查询。比如我们把newproducts换成
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
也是可以的。
在Oracle 10g中MERGE有如下一些改进:
1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
我们通过实例来一一看看如上的新特性
1. UPDATE或INSERT子句是可选的
在9i里由于必须insert into和update都要存在,也就是不是update就是insert,不支持单一的操作,虽然还是可以曲线救国,呵呵 但是有些过于强势了。而10g里就是可选了,能符合我们更多的需求了
比如上面的句子
我们可以只存在update或者insert
merge into products p using newproducts np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
这里,如果匹配就更新,不存在就不管了。
2. UPDATE和INSERT子句可以加WHERE子句
这也是一个功能性的改进,能够符合我们更多的需求,这个where的作用很明显是一个过滤的条件,是我们加入一些额外的条件,对只对满足where条件的进行更新和insert
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name where np.product_name like 'OL%'
这里表示只是对product_name开头是'OL'的匹配上的进行update,如果开头不是'OL'的就是匹配了也不做什么事情,insert里也可以加入where
比如
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name where np.product_name like 'OL%'
when not matched then
insert values(np.product_id, np.product_name, np.category) where np.product_name like 'OL%'
这里注意比较一下,他们返回的结果行数,是有着差异的。
3. 在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
merge into products p using (select * from newproducts) np on (1=0)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
个人觉得这个功能没有太大的意义,我们的insert into本身就支持这样的功能,没有必要使用merge
4. UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
delete只能和update配合,从而达到删除满足where条件的子句的纪录
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name delete where p.product_id = np.product_id where np.product_name like 'OL%'
when not matched then
insert values(np.product_id, np.product_name, np.category)
这里我们达到的目的就是 会把匹配的记录的prodcut_name更新到product里,并且把product_name开头为OL的删除掉。
merge into也是一个dml语句,和其他的dml语句一样需要通过rollback和commit 结束事务。
Merge是一个非常强大的功能,而且是我们需求里经常会用到的一个有用的功能,所以我们一定要好好的学习。
原文:http://blog.csdn.net/inthirties/article/details/4731930
分享到:
相关推荐
通过`MERGE INTO`,我们可以更加灵活地管理数据库中的数据,无论是更新已有记录,还是插入新记录,甚至删除不符合条件的记录,都可以在一个SQL语句中完成,极大地简化了编程逻辑,提高了代码的可读性和执行效率。...
通过 Merge Into 语句,我们能够在一个语句中对一个表同时执行 Insert 和 Update 操作,根据这个表或子查询的连接条件对另一个表进行查询,连接条件匹配上的进行 Update 操作,并且在其后面还可以接删除操作,无法...
可以使用以下语句: 更新一个字段: INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KEY UPDATE columnA=IF(columnB>0,1,columnA) 更新多个字段: INSERT INTO tbl (columnA,columnB,...
在Oracle中,SQL语句执行效率低下通常表现为资源过度消耗,这可能包括CPU时间、内存使用、磁盘I/O等。具体分析可从以下几个方面入手: 1. **响应时间不达标**:当查询响应时间超出预期时,应检查SQL语句是否涉及...
本文将详细介绍 Oracle 中 `MERGE` 关键字的使用方法,并结合实际示例来解析其工作原理。 #### 二、`MERGE` 语句的基本概念 在 Oracle 9i R2 版本之前,如果需要同时进行更新和插入操作,开发人员通常需要编写两条...
WHERE 子句在 Merge Into 中的作用类似于在普通 SQL 语句中的作用,但它提供了一种更为精细的控制机制。你可以使用 WHEN MATCHED THEN UPDATE 和 WHEN NOT MATCHED THEN INSERT 结合 WHERE 子句来实现更复杂的业务...
在Oracle 9i中,`MERGE INTO`语句首次被引入,它允许在同一语句中执行`INSERT`和`UPDATE`操作。到了Oracle 10g,这个功能得到了进一步增强,使其更加强大和灵活。通过`MERGE INTO`,可以基于源表和目标表之间的匹配...
通过这个命令,用户可以在一个单一的SQL语句中完成对表的插入(`INSERT`)和更新(`UPDATE`)操作,极大地简化了数据处理流程并提高了效率。 #### 二、Oracle 10g 中 Merge 命令的新特性 在Oracle 10g中,`MERGE`命令...
总结来说,针对Oracle数据库的update语句的优化,主要可以从简化SQL语句结构、合理使用子查询和join操作、采用merge语句以及编写PL/SQL游标处理等多方面入手。在实际应用中,根据具体情况选择合适的优化方案,能够...
详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询
1. 在 Merge 语句中,update 不能用于更新连接的列。例如: ```sql MERGE INTO merge_test2 M USING merge_test1 N ON (M.a = N.a) WHEN MATCHED THEN UPDATE SET M.a = N.b, M.b = N.b WHEN NOT MATCHED THEN ...
`oracle-merge.txt`文件则介绍了MERGE语句,它能够根据一个源表的数据更新或插入到目标表中,同时处理重复记录的问题。 5. Oracle SQL语句练习:`Oracle_sql语句练习.txt`和`oracle-sql练习2.txt`可能包含了各种SQL...
在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。死锁不仅影响数据库性能,还会影响应用程序的可用性和用户...
Oracle SQL 作为业界广泛使用的数据库查询语言之一,在这一过程中扮演着关键角色。为了提升SQL语句的执行效率,Oracle 提供了一系列称为“暗示”(Hints)的功能。本文将深入探讨 Oracle SQL 语句暗示的相关知识点,...
Oracle中的`MERGE INTO`语句是一种强大的工具,用于整合数据操作,如更新、插入和删除,...需要注意的是,`MERGE INTO`可能会触发并发控制问题,因此在多用户环境中使用时需要谨慎,确保事务处理和并发控制策略适当。
在Oracle数据库管理中,`MERGE`语句是一种强大的功能,它允许用户根据源表中...综上所述,`MERGE`语句在Oracle数据库中提供了灵活且高效的数据同步手段,但正确使用它需要对语法有深入的理解,并注意潜在的陷阱和限制。
在Oracle数据库系统中,SQL(Structured Query Language)语句的性能优化是提升系统效率的关键环节。这本"Oracle数据库SQL语句的性能优化.pdf"很可能提供了深入的指导,旨在帮助数据库管理员和开发人员理解如何写出...