zoukankan      html  css  js  c++  java
  • MERGE语法详解

    merge语法是根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入。

    其基本语法规则是

    merge into 目标表 a

    using 源表 b

    on(a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2 ……)  

    when matched then update set a.更新字段=b.字段

    when  not macthed then insert into a(字段1,字段2……)values(值1,值2……)

    变种写法①,只更新:

    merge into 目标表 a

    using 源表 b

    on(a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2 ……)  

    when matched then update set a.更新字段=b.字段,a.更新字段2=b.字段2……

    变种写法②,只插入:

    merge into 目标表 a

    using 源表 b

    on(a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2 ……)  

    when  not macthed then insert into a(字段1,字段2……)values(值1,值2……)

    注:条件字段不可更新

    对于Oracle来说,merge是9i新增的语法,在10g进行了一些增强,如下:

    测试环境:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

    ①条件操作:

    merge into 目标表 a

    using 源表 b

    on(a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2 ……)  

    when matched then update set a.更新字段=b.字段  where 限制条件

    when  not macthed then insert into a(字段1,字段2……)values(值1,值2……) where 限制条件

    举例:

    merge into test_merge a
    using test b
    on(a.no=b.no)
    when matched then update set a.no2=b.no2 where a.no<>1
    when not matched then insert values(b.no,b.no2)  where a.no<>100

    当然也支持变种①②的写法

    ②删除操作

    merge into 目标表 a

    using 源表 b

    on(a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2 ……)  

    when matched then update set a.更新字段=b.字段

    delete where b.字段=xxx

    举例:

    merge into test_merge a
    using test b
    on(a.no=b.no)
    when matched then update set a.no2=b.no2 where a.no<>1
    delete
    where b.no=14

    备注:删除动作针对的也是目标表,并且必须在语句最后

    基本上merge的用法就是以上这些,建议平常可以多用,比单独的update+insert的方式效率要更高,尤其是on条件下有唯一索引的时候,效率更高

     



  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/Yggdrasil/p/6562191.html
Copyright © 2011-2022 走看看