oracle中使用merge into

DUAL表解释

  • 在Oracle数据库中,dual是Oracle中的一个伪表,在Oracle数据库中的select语句的语法为:

    SELECT column_1,  column_2, ...  FROM  table_name;

    即在使用select语句时,如果没有表名,就没办法执行查询,而当我们想查看当前时间sysdate或者想计算出一个表达式例如2+3的值的时候,如果没有表是无法执行操作的,故Oracle数据库出现了伪表dual的概念。

    --查询当前时间,如果后面不跟表,则无法查询,例如
    SELECT sysdate ;
    --正确写法
    SELECT sysdate FROM daul;
  • 特点:

    • dual名词意思是对数,做形容词时是指二重的,二元的。
    • 它是一个单行单列的虚拟表。
    • Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据。
    • Dual表主要用来选择系统变量或求一个表达式的值。
  • 总结:dual表就是oracle与数据字典自动创建的一张表,这张表是一个单行单列的表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据。dual表主要是用来选择系统变量或是求一个表达式的值。

使用场景

  • 对数据库操作时,会存在这样的需求:insert 或者 Update;
  • 根据某一个条件(比如唯一索引,唯一主键等)查询数据库,如果数据库中存在该条数据,则更新,没有的话就将这条数据插入到数据库中。
  • 传统用法:插入之前先select,根据结果来进行update或者insert;
  • 现在:使用MERGE 命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据。

用法

单表

  • 现有测试表Student下有属性sid、name、grade等。传入数据('1001','张三','95')。要求如果存在学号sid为'1001'的学生,则更新他的成绩,没有的话就插入到数据库中。
MERGE INTO  Student S1
USING (SELECT '1001' as sid,'张三' as name,'95' as grade FROM dual) S2
on (S1.sid=S2.sid)
WHEN MATCHED THEN
UPDATE SET S1.name=S2.name,S1.grade=S2.grade
WHEN NOT MATCHED THEN
INSERT
(S1.sid, S1.name,S1.grade)
VALUES
(S2.sid, S2.name,S2.grade );
--具体解释
--USING 这里是我们需要跟数据库进行比较的数据,这里传入的数据为('1001','张三','95'),为了保证USING后面的select有数据,在这里使用了dual表。
--on后面是我们要比较的条件
--WHEN MATCHED THEN 当存在学号为‘1001’这样的数据时,选择将数据库中的这条数据更新
--WHEN NOT MATCHED THEN 当不存在这条数据时,将这条数据插入到数据库中。
  • 原理:在使用using 时搜出来的结果逐条与on条件匹配,然后决定是update还是Insert。 当USING后面的sql没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的。因此需要保证USING 后面的SELECT有数据,可以使用DUAL表作为USING后的表。

  • 注意点:在实际项目中,using表后边传入的数据,可以是前台传过来的对象,例如前台传过来Student(SID:'1001',NAME:'张三',GRADE:'95');这是可以这样:

    MERGE INTO  Student S1
    USING (SELECT #{SID,jdbcType=VARCHAR} sid FROM dual) S2
    on (S1.sid=S2.sid)
    WHEN MATCHED THEN
    UPDATE SET S1.name= #{NAME,jdbcType=VARCHAR},S1.grade=#{GRADE,jdbcType=VARCHAR}
    WHEN NOT MATCHED THEN
    INSERT
    sid,name,grade)
    VALUES
    (#{SID,jdbcType=VARCHAR} #{NAME,jdbcType=VARCHAR},#{GRADE,jdbcType=VARCHAR})
    --mabatis最后语句不能以‘;’结尾,否则会报 ‘无效字符’ 错误。

多表

  • 使用多张表时,比如A 表中的id对应与B表中的aid,只需在USING中使用select语句时的FROM表改为B表即可,其他的使用方法类似。

原创不易,欢迎转载,转载时请注明出处,谢谢!

作者:潇~萧下

原文链接:https://www.cnblogs.com/manongxiao/p/12241833.html

在oracle中使用merge into实现更新和插入数据的更多相关文章

  1. oracle使用 merge 更新或插入数据

    OracleCC++C#  总结下.使用merge比传统的先判断再选择插入或更新快很多. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行, ...

  2. Oracle中把一张表查询结果插入到另一张表中

      1. 新增一个表,通过另一个表的结构和数据 create table XTHAME.tab1 as select * from DSKNOW.COMBDVERSION 2. 如果表存在: inse ...

  3. ORACLE中的MERGE语法使用记录

    项目中使用到了Oracle的MERGE INTO语句,在这里简单记录下使用方法 使用场景如下: 存在对一张数据量很大的表,你需要对里面的大量数据进行更新,如果数据不存在,就进行插入的操作. 常规想到的 ...

  4. oracle 触发器,当一个表更新或插入时将数据同步至另个库中的某个表中

    有两个表分别是 A用户下的 T_SRC_WEATHER_TSPG字段如图, B用户下的t_src_weather 表,如图: 要求,当A用户下的T_SRC_WEATHER_TSPG表有插入或者更新数据 ...

  5. Oracle中如何添加和修改包含日期的数据

    平时我们在sql sverver中我们添加包含日期的数据时,是直接将日期变成日期格式字符串,但是在Oracle中就不行了, 那么,如何添加包含日期数据 如:在oracle执行insert语句 /** ...

  6. 关于Oracle中Sort Merge Join的改写

    业务场景的问题,我们有一个刷CUBE的SQL,是Oracle环境,平时跑70多分钟, 但是最近突然不动了,这个SQL需要算累计值,比如年累计客户数量. 累计值是什么意思呢?我们使用下面的数据来说明问题 ...

  7. Oracle中通过Job实现定时同步两个数据表之间的数据

    1.http://blog.csdn.net/sxdtzhaoxinguo/article/details/41040741 2.Oracle两个数据库定时执行插入: http://zhidao.ba ...

  8. Oracle中的阻塞锁SQL(阻塞在哪个数据上)

        SELECT (   '节点 '           || a.inst_id           || ' session '           || a.sid           || ...

  9. Oracle中如何删除某个用户下的所有数据的方法

    win+R打开cmd 使用dba身份登录: sqlplus sys/sys@orcl as sysdba; 然后使用dba身份删除某个用户: drop user apptdm_9y cascade;

随机推荐

  1. 【WPF学习】第四十一章 变换

    通过使用变换(transform),许多绘图任务将更趋简单:变换是通过不加通告地切换形状或元素使用的坐标系统来改变形状或元素绘制方式的对象.在WPF中,变换由继承自System.Windows.Med ...

  2. codeforces 1020 C Elections(枚举+贪心)

    题意: 有 n个人,m个党派,第i个人开始想把票投给党派pi,而如果想让他改变他的想法需要花费ci元.你现在是党派1,问你最少花多少钱使得你的党派得票数大于其它任意党派. n,m<3000 思路 ...

  3. Why all application lack a kind of most really charm ?

    Website and APP we used now are mostly web2.0 applications. While people practise in use, they can n ...

  4. angular 控件间的通信

    先引入 设置meta元素 http://blog.sina.com.cn/s/blog_51048da70101cgea.html //设置 虚拟窗口的大小等于设备的大小 <meta name= ...

  5. 《Python编程:从入门到实践》分享下载

    书籍信息 书名:<Python编程:从入门到实践> 原作名:Python Crash Course 作者: [美] 埃里克·马瑟斯 豆瓣评分:9.1分(2534人评价) 内容简介 本书是一 ...

  6. 详解SkipList跳跃链表【含代码】

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天继续介绍分布式系统当中常用的数据结构,今天要介绍的数据结构非常了不起,和之前介绍的布隆过滤器一样,是一个功能强大原理简单的数据结构.并且 ...

  7. Redis(十):pub/sub 发布订阅源码解析

    谈到发布订阅模式,相信不会陌生,典型的观察者模式的实现.然而从表面来看,本地实现一个wait/notify通知.register/update调用, 实现一个远程mq服务, 还有本文说的 pub/su ...

  8. Linux 磁盘原理与管理 (分区 挂载)

    目前硬盘与主机系统的联系主要有几种传输介面规格: IDE介面:         IDE介面插槽所使用的排线较宽,每条排线上面可以接两个IDE装置,由於可以接两个装置,那为了判别两个装置的主/从架构, ...

  9. centos7利用系统镜像修复grub

    1 故障描述 由于错误操作,导致grub配置文件失效,系统开机后一直卡在下面的画面. 2 解决办法 这时候,就要利用系统镜像光盘,进入修复模式,然后按下面图示操作 进入镜像的shell环境,如下图所示 ...

  10. Day17-18前端学习之路——常用语句资料库

    一.var 与 let 的区别 var: 可以先初始化再声明该变量; 可以根据需要多次声明相同名称的变量 var myName = 'Chris'; var myName = 'Bob'; let m ...