into可以兑现用B表来更新A表数据,则把B表的数目插入A表.

Oracle在9i引入了merge命令, 
经过这多少个merge你可以在一个SQL语句中对一个表同时实施inserts和updates操作.
本来是update仍旧insert是依照于你的指定的基准判断的,Merge
into可以兑现用B表来更新A表数据,如若A表中一直不,则把B表的多寡插入A表.
MERGE命令从一个或三个数据源中采用行来updating或inserting到一个或多少个表 

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 [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) 

大家先看看一个简单易行的例证,来介绍一个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是批量拍卖对性能贡献很大,个人觉得这多少个是从未考证的。

在这一个例子里。前边的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语句的。

大家也可以在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) 
也是足以的。 

咱们也足以在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子句来去除一些不需要的行 

在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%’ 

  1. UPDATE或INSERT子句是可选的 
    在9i里由于必须insert
    into和update都要设有,也就是不是update就是insert,不协理单一的操作,无法灵活变通。而10g里就是可选了,能契合大家更多的需要了 
    比如说下边的句子 
    咱俩得以只设有update
    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所有的行到目标表中,不需要连续源表和对象表 

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 

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
    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的删除掉。
  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 into也是一个dml语句,和任何的dml语句一样需要通过rollback和commit
停止工作。 

Merge是一个不胜强劲的功力,而且是大家需要里不时会用到的一个意义。

Merge是一个那些有力的效应,而且是大家需要里常常会用到的一个实用的意义,所以我们肯定要过得硬的求学。 
原文:http://blog.csdn.net/inthirties/article/details/4731930

相关文章