Oracle中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_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

相关文章