into能够兑现用B表来更新A表数据

Oracle在9i引入了merge命令, 
通过那几个merge你可见在三个SQL语句中对2个表同时施行inserts和updates操作.
自然是update照旧insert是基于于您的钦点的基准判断的,Merge
into能够实现用B表来更新A表数据,借使A表中绝非,则把B表的数据插入A表.
ME翼虎GE命令从1个或七个数据源中挑选行来updating或inserting到一个或八个表 

Merge是3个尤其实惠的效能,类似于MySQL里的insert
into on duplicate key. 

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

Oracle在9i引入了merge命令, 
透过这几个merge你可以在一个SQL语句中对二个表同时实施inserts和updates操作.
本来是update如故insert是依据于你的钦赐的原则判断的,Merge
into能够兑现用B表来更新A表数据,假使A表中从未,则把B表的数码插入A表.
ME宝马X3GE命令从二个或多个数据源中挑选行来updating或inserting到3个或八个表 

大家先看看三个不难的事例,来介绍三个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 [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 ! ] 

在这一个事例里。前边的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是批量拍卖对品质进献一点都不小,个人认为这么些是从未有过考证的。

大家先看看3个大约的事例,来介绍四个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) 

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

在这几个事例里。前边的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是批量处理对品质进献十分大,个人觉得那些是尚未考证的。 

在Oracle 10g中ME逍客GE有如下一些更正: 
① 、UPDATE或INSE猎豹CS6T子句是可选的 
二 、UPDATE和INSE中华VT子句能够加WHERE子句 
③ 、在ON条件中应用常量过滤谓词来insert全数的行到目的表中,不须求再而三源表和目的表 
④ 、UPDATE子句前面能够跟DELETE子句来去除一些不须要的行 

我们也足以在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中ME奔驰M级GE有如下一些改革: 
一 、UPDATE或INSETiggoT子句是可选的 
贰 、UPDATE和INSE奥迪Q5T子句可以加WHERE子句 
三 、在ON条件中应用常量过滤谓词来insert所有的行到目的表中,不须求连接源表和对象表 
肆 、UPDATE子句前边能够跟DELETE子句来去除一些不需求的行 

  1. UPDATE或INSEOdysseyT子句是可选的 
    在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和INSE奥德赛T子句能够加WHERE子句 
    那也是3个成效性的改进,能够契合我们更加多的急需,这些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或INSEPAJEROT子句是可选的 
    在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子句 
    那也是2个效率性的改进,能够适合大家更多的急需,那些where的作用很明显是3个过滤的准绳,是大家进入一些万分的规则,对只对知足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 

3.
在ON条件中使用常量过滤谓词来insert全数的行到指标表中,不须要一而再源表和目的表 

  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 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也是二个dml语句,和任何的dml语句一样须求经过rollback和commit
截至工作。 

  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是1个要命强大的作用,而且是大家供给里不时会用到的多少个卓有效能的职能,所以大家终将要好好的学习。 
原文:http://blog.csdn.net/inthirties/article/details/4731930

merge into也是2个dml语句,和其余的dml语句一样供给通过rollback和commit
结束工作。 

相关文章