zoukankan      html  css  js  c++  java
  • Oracle中merge into的使用

    我们操作数据库的时候,有时候会遇到insertOrUpdate这种需求。

    如果数据库中存在数据就update,如果不存在就insert。

    以前的时候,需要额外select查询一下,如果有数据就update,如果没有数据就insert。

    而现在Orcale数据库都提供了 MERGE 方法来处理这种需求。

    MERGE 命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据。

    MERGE 语法:

    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 MATCHED THEN [here you can execute some update sql or something else ] 
    WHEN NOT MATCHED THEN [execute something else here ! ] 

    使用例子:

    create table TEST (ID INTEGER,VALUE VARCHAR2(255) );   
    insert into TEST values (1, 'test1');   
    insert into TEST values (2, 'test2');   

    我们想插入一条数据  {ID=2,NAME='newtest2'}  那么可以这么写

    MERGE INTO  TEST T1
    USING (SELECT '2' as ID, 'newtest2' as NAME FROM dual) T2 on (T1.ID=T2.ID)
    WHEN MATCHED THEN UPDATE SET T1.NAME=T2.NAME
    WHEN NOT MATCHED THEN  INSERT (T1.ID, T1.NAME) VALUES (T2.ID, T2.NAME ); 

    如果ID为2的数据存在那么 UPDATE,如果不存在INSERT

    注意事项:

    Merge Into的原理是,从using 搜出来的结果逐条与on条件匹配,然后决定是update还是Insert。 当USING后面的sql没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的。

    所以要想让Merge Into正常运行,要保证USING 后面的SELECT有数据,个人喜欢使用DUAL表作为USING后的表,方便自己控制。

    MERGE INTO TD21_BLACK_IMP T1 USING (SELECT 'VERSION2019/08/01' as ID from dual ) T2 on (T1.ID = T2.ID )
    when matched then update set T1.RESULT = '导入外购黑名单 1条'when not matched then insert ( ID ,IMP_DATE ,RESULT )
    values('VERSION2019/08/01','2019-08-01','导入外购黑名单1条')

  • 相关阅读:
    第一次会议(2019.3.4)
    改革春风吹满地小组~~成立了~~⭐😄~~
    PYQT5 系列(一)——参考自《弗兰克万岁》
    Springboot2.0学习笔记1__微服务及springboot的作用
    Java学习之---------------反射
    Jquery对select的操作 添加一个select
    匿名函数
    数据库迁移
    EF 未应用自动迁移,因为自动迁移会导致数据丢失的解决办法
    在Chrome+Visual Studio中调试asp.net程序很慢的问题(Firefox也有类似问题)
  • 原文地址:https://www.cnblogs.com/mayhh/p/11283809.html
Copyright © 2011-2022 走看看