OracleOracle中Merge语句的使用

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_Oracle,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 

  1. 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

相关文章