为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的。

MERGE是什么?这么厉害的东西你都不知道,你这学生是怎么学习的?老师不给你讲你就不会自学了吗?哎!可怜天下老师心啊,罢了罢了,老师现在给你好好讲一下吧。
MERGE是Oracle9i新增的语法,中文意思是“合并”,那合并什么呢?它能合并INSERT和UPDATE在一条SQL语句中执行,是不是很牛X?!还有更牛X的,就是在执行该条语句时只做一次全表扫描,效率非常高。是不是有点心痒难耐了,哈哈,不着急,老师接下来给你具体讲讲它的用法。不过在讲之前我们需要做两点准备工作:
一、创建测试表且填充测试数据

[sql] view plain copy
  1. create table merge_test as select * from scott.dept

二、修改测试表的数据,为了与原表scott.dept的数据产生差异。

[sql] view plain copy
  1. delete from merge_test t where t.deptno=10
[sql] view plain copy
  1. update merge_test t set t.dname = 'TEST'

OK,那现在客户提出一个需求,让表merge_test中的机构信息与scott.dept表保持一致。

这个太简单了,执行下面的两条SQL语句不就可以了?!

[sql] view plain copy
  1. delete from merge_test
[sql] view plain copy
  1. insert into merge_test select * from scott.dept

不得不说这位同学确实有过人之处,这个别人想都不敢想的方法都被他想到了,老师只能说:“我要是你爸,当年你就在墙上了”。虽然说此方法确实到达了“目的”,但是却太不完善了,如果客户只想要保证机构名称字段一致即可呢?此方法肯定便秘了,还有谁有更好的方法?

有!有!有!先把scott.dept表中的字段dname值更新到表merge_test的字段dname。

[sql] view plain copy
  1. update merge_test m
  2. set dname =
  3. (select dname from scott.dept t where m.deptno = t.deptno)

再把没在merge_test表中而在scott.dept表中的数据插入表merge_test。

[sql] view plain copy
  1. insert into merge_test m
  2. select *
  3. from scott.dept
  4. where deptno not in (select deptno from merge_test)

这位同学还不错,有点SQL基础,很好,为了激励其他同学能想出更好的方法,老师决定下课后给这位同学买小布丁吃。不过是否还有更好更便捷的方法呢?我想同学们的水平应该也就到这,那老师就不再谦虚了(老师是干什么使的?老师就是在你们不知道的时候让你们知道,在你们都知道的时候回家睡大觉)。下面老师就给你们讲一种更加高级的方法,先看SQL语句。

[sql] view plain copy
  1. merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
  2. matched then update set m.dname = t.dname when not matched then insert values(t.deptno, t.dname, t.loc)

给同学解释一下上面的语句,把表scott.dept中的数据根据关联条件m.deptno = t.deptno更新到merge_test表中,如果表merge_test中的deptno在表scott.dept中存在(matched 匹配),则执行更新操作update set m.dname = t.dname,如果表merge_test中的deptno在表scott.dept中不存在(not matched 不匹配),则执行插入操作insert values(t.deptno, t.dname, t.loc)。

一些聪明的同学可能会问了,只能全表操作吗?可不可以根据筛选条件来操作呢?这样的同学真让人省心,你说老师能不喜欢吗?!针对这个问题,答案是肯定的,比如我只想更新deptno=20的部门名称,修改后的SQL语句如下:

[sql] view plain copy
  1. merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
  2. matched then update set m.dname = t.dname
  3. where (m.deptno = 20) when not matched then insert values(t.deptno, t.dname, t.loc)

为了表达老师是一位可爱的、正直的、无私的、(此处省略掉1500字褒义词)人,老师决定在本节课最后赠送另外一个“小礼品”给同学们。在该语法中甚至还可以使用delete,如果表merge_test中的deptno在表scott.dept中存在则删除deptno=20的机构信息,修改后的SQL语句如下:

[sql] view plain copy
  1. merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
  2. matched then update set m.dname = t.dname delete
  3. where (m.deptno = 20) when not matched then insert values(t.deptno, t.dname, t.loc)

好了现在老师可以下课回家睡觉了,GOOD GOOD STUDY, DAY DAY UP.

备注:where与delete的语法是Oracle10i新增的。

傅老师课堂:Oracle高级应用之合并MERGE相关推荐

  1. 傅老师课堂:Oracle高级查询之GROUP BY

    为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. 现在客户的需求是统计部门中每种工作的工资总额,最后还需要统计所有人的工资总数,相信这样的需求对大家来说还是比较简单的, ...

  2. 傅老师课堂:Oracle高级查询之CONNECT BY

    为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. Oracle中的select语句可以用start with ... connect by prior ...子句实现递 ...

  3. 傅老师课堂:Oracle高级应用之解锁表

    每篇一笑:老鼠去方便,见熊也在,吓得不吭声,熊看了眼老鼠说:你掉不掉毛?老鼠哆嗦不语,熊又问:掉不掉毛?老鼠说:不掉!熊抓住老鼠擦擦屁股走了. 锁机制用于管理对共享资源的并发访问.注意,我说的是&qu ...

  4. 傅老师课堂:Oracle高级查询之OVER (PARTITION BY ..)

    [size=large][size=large][size=large]开篇一笑:某日一妹子对男友说:在一起这么久了你都没有夸过我漂亮,今天我要你夸夸我,男子想了一会看着女友鸡冻的说道:我硬了. 为了 ...

  5. 傅老师课堂:Oracle高级应用之物化视图(materialized view)

    原文地址:http://hi.baidu.com/gukeming888/blog/item/2682f69481c8237154fb9662.html 物化视图 (Materialized View ...

  6. 傅老师课堂:Oracle高级查询之OVER (PARTITION BY ..) 1

    为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. 注:标题中的红色order by是说明在使用该方法的时候必须要带上order by. 一.rank()/dense_r ...

  7. oracle高级函数去重,傅老师课堂:Oracle高级应用之去重聚合函数

    开篇一笑:高中的时候,自行车被偷,早上顺路搭同学的自行车.我坐在后座看到前面一大妈跑步,很猥琐的对同学说:"你看前面那个肥婆跑得屁股都甩圆了!"这货沉默了一下.当我们和大妈擦身而过 ...

  8. 傅老师课堂:Ajax高级应用之DWR原理解析(二)

    开篇一笑:周杰伦在沙漠中迷路了,这时他捡到一个神灯,他摸摸神灯,出来一个神仙,神仙说,我能满足你三个愿望.周杰伦一看,高兴的脱口而出:"哇塞,屌爆了!"结果,他痛苦的在地上呻吟.神 ...

  9. 傅老师课堂:TrieTree

    TrieTree与其说是一种算法,还不如说是一种解题的思路,我对海量数据的处理一直都是保持着一种积极的学习态度,TrieTree可以说是处理海量数据诸多方法中比较典型的一种,下面我提供了两种TrieT ...

最新文章

  1. 利用Python实现十大经典排序算法(附代码流程)
  2. vue生命周期大白话篇
  3. iphone开蓝牙wifi上网慢_为啥我开锁总是比别人慢?
  4. c语言uppercase恢复小写,C语言转换字符串为大写和小写
  5. Repeater控件绑定数据、分页、数据操作,最佳代码
  6. CCF201712-2 游戏
  7. python 类初始化函数_C类初始化函数
  8. linux系统调用的使用例子,Linux增加系统调用步骤和实例
  9. Jmeter安装教程
  10. 软考-计算机系统知识整理
  11. 计算机程序配置不正确 请联系我们,电脑应用程序配置不正确怎么办
  12. 【Hadoop】Hadoop组件 -之 HDFS组件
  13. 日语格助词全部学习笔记
  14. 字节跳动做教育能否摆脱互联网公司“流量魔咒”?
  15. stm32 win7 64位虚拟串口驱动安装失败解决办法
  16. 提高排名的 15 个基本 SEO 技巧
  17. java-php-python-ssm在线交友系统2021计算机毕业设计
  18. 【学习笔记】AGC009/AGC019/AGC029/AGC035
  19. MAME模拟器debug帮助文档汉化二(常规指令)
  20. 机器学习基础概念——过拟合和欠拟合

热门文章

  1. java ireport生成pdf_Ireport,JAVA报表制作并导出(pdf、excel、word)
  2. Python3 源码安装
  3. python+playwright 学习-6.截图使用
  4. ubunto16.04 安装配置
  5. 给Mi5刷个原生安卓系统
  6. 你可以厌恶世俗的眼光,但是你不能逃避
  7. 1.3 模拟/dp|大话移动通信
  8. gmv和销售额的区别是什么?
  9. jarsigner 错误: java.lang.RuntimeException: 密钥库加载: Invalid keystore format
  10. 全国省市区(县)级地名xml(二)