MERGE INTO 用法

MERGE语句是 Oracle9i新增的语法,用来合并UPDATE和INSERT语句。

  通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,

  连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。

  这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。

语法

MERGE [INTO [schema .] table [t_alias]

  USING [schema .] { table | view | subquery } [t_alias]

  ON ( condition )

  WHEN MATCHED THEN merge_update_clause

  WHEN NOT MATCHED THEN merge_insert_clause;

1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

例:

基础表Base

       DJH    TDYT         QSXZ      QLR     TXDZ      

       0001       071         10           张三       建设路    

       0002       051         20           王五       新华路    

       0003       071         30           李四       光明路    

临时变化记录表(Temp

       DJH        QLR        TXDZ     

       0001       赵六        建设路    

       0002       王五        苏州街    

       0004       李武        学院路    

 

利用提供的Merge命令我们使用如下SQL语句进行更新

merge into base p using temp np on (p.djh = np.djh)

when matched then

update set p.QLR = np.QLR , p.txdz=np.txdz 

when not matched then

insert (djh,qlr,txdz) values(np.DJH, np.QLR, np.TXDZ) 

                  

结果变成

      DJH        TDYT       QSXZ      QLR        TXDZ

       0001       071         10           赵六     建设路

       0002       051         20           王五     苏州街

       0003       071         30           李四     光明路

       0004                                   李武     学院路

在Oracle 10g中MERGE有如下一些改进:
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

1、UPDATE或INSERT子句是可选的

merge into base p using temp np on (p.djh = np.djh)

when matched then

update set p.QLR = np.QLR , p.txdz=np.txdz 

如上题所示,用户可以选择只更新,不匹配的不做处理
2、UPDATE和INSERT子句可以加WHERE子句

merge into base p using temp np on (p.djh = np.djh)

when matched then

update set p.QLR = np.QLR , p.txdz=np.txdz  where p.tdyt=’071’

如上题所示,用户可以在更新或者插入子句里面加入Where过滤条件,使语句变得更加灵活
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

delete只能和update配合,从而达到删除满足where条件的子句的纪录

 

merge into base p using temp np on (p.djh = np.djh)

when matched then

update set p.QLR = np.QLR , p.txdz=np.txdz  delete where p.tdyt=’051’

如上题所示

 

      DJH        TDYT       QSXZ      QLR        TXDZ

       0004                                   李武        学院路

       0001       071         10           赵六        建设路

       0003       071         30           李四        光明路

merge into也是一个dml语句,和其他的dml语句一样需要通过rollback和commit 结束事务。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值