zoukankan      html  css  js  c++  java
  • Oracle存在则更新,不存在则插入应用-merge

    转:

    Oracle存在则更新,不存在则插入应用-merge

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/hong10086/article/details/54342819

    Oracle在9i引入了merge命令,

    通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表

    1. MERGE INTO table_name alias1
    2. USING (table|view|sub_query) alias2
    3. ON (join condition)
    4. WHEN MATCHED THEN
    5. UPDATE table_name
    6. SET col1 = col_val1,
    7. col2 = col_val2
    8. WHEN NOT MATCHED THEN
    9. INSERT (column_list) VALUES (column_values);

     

    在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。

    因此,严格意义上讲,“在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。”

    实例:

    T有a、b两个字段 a是主键。现在有记录(1001,2)要保存到T中,T中如果已经存在则更新字段b,没有插入。

     

     

    1. MERGE INTO T T1
    2.  
    3. USING (SELECT '1001' AS a,2 AS b FROM dual) T2
    4.  
    5. ON ( T1.a=T2.a)
    6.  
    7. WHEN MATCHED THEN
    8.  
    9. UPDATE SET T1.b = T2.b
    10.  
    11. WHEN NOT MATCHED THEN
    12.  
    13. INSERT (a,b) VALUES(T2.a,T2.b);

     

    实例:

    mybatist 中的sql:

      1. <insert id="mergeInto" >
      2.  
      3. MERGE INTO CATEGORY_EXPERT_GRADE T1
      4. USING ( select ${categoryFk} as a, ${expertFk} as b FROM dual) T2
      5. ON ( T1.CATEGORY_FK=T2.a and T1.EXPERT_FK=T2.b)
      6. WHEN MATCHED THEN
      7. UPDATE SET T1.GRADE = #{grade,jdbcType=VARCHAR}
      8. WHEN NOT MATCHED THEN
      9. insert (PK, CATEGORY_FK, EXPERT_FK,GRADE, SAVE_DATE, FLAG,EXTEND1, EXTEND2, EXTEND3)
      10. values (Sequence_Shzj.nextval, #{categoryFk,jdbcType=DECIMAL}, #{expertFk,jdbcType=DECIMAL},
      11. #{grade,jdbcType=VARCHAR}, #{saveDate,jdbcType=DATE}, #{flag,jdbcType=DECIMAL},
      12. #{extend1,jdbcType=VARCHAR}, #{extend2,jdbcType=VARCHAR}, #{extend3,jdbcType=VARCHAR}
      13. )
      14.  
      15. </insert>
  • 相关阅读:
    什么是高可用性(High Availability)?
    Programer's Tools
    dotnetcore 站点搭建实践
    Nginx使用总结
    小程序开发工具一直登陆不上,提示网络失败
    前端页面JS和CSS以及图片加载nginx报错:net::ERR_CONTENT_LENGTH_MISMATCH的解决与检查
    angualrjs添加ngTouch
    H5自定义金额键盘,改良后ios体验效果流畅
    js生成带有logo的二维码并保存成图片下载
    模仿input闪烁光标
  • 原文地址:https://www.cnblogs.com/libin6505/p/11528848.html
Copyright © 2011-2022 走看看