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

    1.merge into的用途

    Merge是一个非常有用的功能,与DB2中的merge into功能几乎一样,与Mysql里的insert into on duplicate key也很类似。MERGE INTO 是Oracle 9i以后才出现的新的功能。简单来说可以是一个“有则更新,无则插入”的功能。

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

    2.Merge into的基本语法

    语法如下 :

    1 MERGE [INTO [schema .] table [t_alias] 
    2 USING [schema .] { table | view | subquery } [t_alias] 
    3 ON ( condition ) 
    4 WHEN MATCHED THEN [merge_update_clause ]
    5 WHEN NOT MATCHED THEN [merge_insert_clause];

    通俗点就是如下的语法

    1 MERGE INTO [表名] [表别名] 
    2 USING ( [查询内容] )[或者像表查询一样的语句] 
    3 ON ([条件表达式] AND [...]...) 
    4 WHEN MATHED THEN [匹配的update操作] 
    5 WHEN NOT MATHED THEN [不匹配的insert操作] 

    举个例子看看:

    1 merge into Students st using newStudents nst on (st.id = nst.id) 
    2 when matched then 
    3 update set st.name = nst.name 
    4 when not matched then 
    5 insert values(nst.id, nst.name, nst.sex) 

    前面的merger into Students using newStudents 意思是用newStudents表来merge到Students表,匹配关系就是根据on后面的条件子句的内容,这里根据两个表的id来进行匹配,那么匹配上了我们的操作是就是when matched then的子句里的动作了,这里的动作是update set st.name =nst.name, 就是把newStudents里的name,赋值到Students的name里。如果没有匹配上则insert这样的一条语句进去。通过这个简单的小例子,这个merget inot的用法还是比较容易理解的。这里merger into的功能,好比比较,然后选择更新或者是插入,像是武术套路的一套组合拳。在做merge into的时候,这样同样的情况下,merge的性能是优于同等功能的update/insert语句的。有分析说merge into是单纯的insert/update效率的好几倍,本人没有考究过,不做评论 。 

    3.Oracle 10g后的改进

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

  • 相关阅读:
    gin使用validator库参数校验若干实用技巧
    在gin框架中使用JWT
    使用zap接收gin框架默认的日志并配置日志归档
    gin框架路由拆分与注册
    Gin框架介绍及使用
    GO学习-(39) 优雅地关机或重启
    GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
    WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
    [ 夜间模式 ] NightVersion
    HDU1518 Square(DFS)
  • 原文地址:https://www.cnblogs.com/onlookers/p/4270418.html
Copyright © 2011-2022 走看看