则把B表的数据插入A表.,into能够完成用B表来更新A表数据

MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表 ,MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表 

Oracle在9i引入了merge命令, 
通过那个merge你可见在三个SQL语句中对多少个表同时施行inserts和updates操作.
自然是update依然insert是依照于您的钦命的标准判断的,Merge
into能够实现用B表来更新A表数据,假设A表中尚无,则把B表的多少插入A表.
MEKugaGE命令从3个或三个数据源中选用行来updating或inserting到二个或几个表 

Oracle在9i引入了merge命令, 
透过那一个merge你能够在二个SQL语句中对1个表同时实施inserts和updates操作.
本来是update依旧insert是依照于你的钦命的基准判断的,Merge
into可以兑现用B表来更新A表数据,假诺A表中并未,则把B表的多少插入A表.
ME凯雷德GE命令从二个或多个数据源中选取行来updating或inserting到3个或多少个表 

语法如下 
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) 

咱俩先看看二个简单的例子,来介绍1个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中MEHavalGE有如下一些订正: 
壹 、UPDATE或INSE卡宴T子句是可选的 
二 、UPDATE和INSE奥迪Q5T子句能够加WHERE子句 
③ 、在ON条件中应用常量过滤谓词来insert全体的行到指标表中,不须要延续源表和指标表 
肆 、UPDATE子句前面可以跟DELETE子句来去除一些不供给的行 

在Oracle 10g中ME汉兰达GE有如下一些改革: 
壹 、UPDATE或INSE凯雷德T子句是可选的 
二 、UPDATE和INSEGL450T子句能够加WHERE子句 
三 、在ON条件中应用常量过滤谓词来insert全体的行到指标表中,不须求连接源表和目的表 
④ 、UPDATE子句后边能够跟DELETE子句来去除一些不须求的行 

我们通超过实际例来挨家挨户看看如上的新特点 

咱俩因而实例来挨家挨户看看如上的新特征 

  1. UPDATE或INSE奥迪Q5T子句是可选的 
    在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和INSECRUISERT子句能够加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或INSE奥迪Q3T子句是可选的 
    在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和INSE途睿欧T子句能够加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也是3个dml语句,和其余的dml语句一样要求通过rollback和commit
停止工作。 

merge into也是贰个dml语句,和别的的dml语句一样要求通过rollback和commit
停止工作。 

Merge是2个老大强劲的遵从,而且是我们供给里时常会用到的一个成效。

Merge是二个至极强大的意义,而且是咱们必要里时常会用到的1个灵光的法力,所以大家一定要出彩的上学。 
原文:http://blog.csdn.net/inthirties/article/details/4731930