为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的。
MERGE是什么?这么厉害的东西你都不知道,你这学生是怎么学习的?老师不给你讲你就不会自学了吗?哎!可怜天下老师心啊,罢了罢了,老师现在给你好好讲一下吧。
MERGE是Oracle9i新增的语法,中文意思是“合并”,那合并什么呢?它能合并INSERT和UPDATE在一条SQL语句中执行,是不是很牛 X?!还有更牛X的,就是在执行该条语句时只做一次全表扫描,效率非常高。是不是有点心痒难耐了,哈哈,不着急,老师接下来给你具体讲讲它的用法。不过在 讲之前我们需要做两点准备工作:
一、创建测试表且填充测试数据
- create table merge_test as select * from scott.dept
二、修改测试表的数据,为了与原表scott.dept的数据产生差异。
- delete from merge_test t where t.deptno=10
- update merge_test t set t.dname = 'TEST'
OK,那现在客户提出一个需求,让表merge_test中的机构信息与scott.dept表保持一致。
这个太简单了,执行下面的两条SQL语句不就可以了?!
- delete from merge_test
- insert into merge_test select * from scott.dept
不得不说这位同学确实有过人之处,这个别人想都不敢想的方法都被他想到了,老师只能说:“我要是你爸,当年你就在墙上了”。虽然说此方法确实到达了“目的”,但是却太不完善了,如果客户只想要保证机构名称字段一致即可呢?此方法肯定便秘了,还有谁有更好的方法?
有!有!有!先把scott.dept表中的字段dname值更新到表merge_test的字段dname。
- update merge_test m
- set dname =
- (select dname from scott.dept t where m.deptno = t.deptno)
再把没在merge_test表中而在scott.dept表中的数据插入表merge_test。
- insert into merge_test m
- select *
- from scott.dept
- where deptno not in (select deptno from merge_test)
这位同学还不错,有点SQL基础,很好,为了激励其他同学能想出更好的方法,老师决定下课后给这位同学买小布丁吃。不过是否还有更好更便捷的方法呢?我想 同学们的水平应该也就到这,那老师就不再谦虚了(老师是干什么使的?老师就是在你们不知道的时候让你们知道,在你们都知道的时候回家睡大觉)。下面老师就 给你们讲一种更加高级的方法,先看SQL语句。
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- 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语句如下:
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- matched then update set m.dname = t.dname
- 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 语句如下:
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- matched then update set m.dname = t.dname delete
- 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高级SQL学习与练习涵盖了数据库编程中的一系列高级主题,旨在帮助数据库开发者和管理员提高解决复杂问题的能力。在Oracle数据库系统中,高级SQL技能是进行高效数据管理、查询优化和复杂数据处理的基础。 1. ...
有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。 JARED STILL 从1994年就开始使用...
- **合并(Merge)**: Oracle的`MERGE`语句用于实现“更新插入”,当两个表结构一致时,根据匹配条件更新或插入数据。 2. **查询操作**: - **简单查询(Select)**: 使用`SELECT * FROM`获取表的所有记录,或者`...
Oracle提供了一种称为“多路归并”(Multimaster Merge)的解决方案,它能够合并来自多个源的更改,处理潜在的冲突。配置多节点复制涉及上述双节点配置的扩展,包括更多的发布者和订阅者,以及更复杂的冲突解决策略...
1. 数据操纵语言(DML):在Oracle SQL中,可以使用INSERT、UPDATE、DELETE和MERGE语句对数据进行增加、修改、删除和合并操作。 2. 数据定义语言(DDL):用于定义数据库对象(如表、视图、索引、序列等)的结构。...
8. **merge into 用法.txt**:MERGE INTO是Oracle中的一个高级DML操作,用于合并数据源,实现更新或插入,根据特定条件决定是更新已有记录还是插入新记录。 通过学习这些资料,不仅可以掌握Oracle的基础操作,还能...
这篇学习笔记主要涵盖了Oracle11g的基础知识,包括服务、SQL*Plus命令以及网络配置等方面,同时也提到了一些高级特性如`MERGE INTO`和`INSERT ALL`的使用。 首先,Oracle11g包含了一些关键服务,如`...
6. 探索高级SQL查询技术,如合并查询(MERGE)、并集(UNION ALL)、交集(INTERSECT)、差集(MINUS),以及GROUP BY、ROLLUP、CUBE等聚合函数,提升数据提取效率。 7. 学习编写SQL脚本,生成报表样式的输出结果,...
8. Oracle层次查询:层次查询是Oracle数据库特有的查询类型,用于处理层级数据,本书将提供层次查询的使用技巧和高级应用。 9. 递归WITH编程:递归WITH子句是Oracle 11gR2引入的新特性之一,用于简化递归查询,本书...
Oracle数据库是全球领先的数据库管理系统之一,由甲骨文公司(Oracle Corporation)开发。它支持大型数据库,并且在数据管理、备份和恢复、安全性、并发控制以及事务管理方面表现出色,广泛应用于企业级应用中。...
合并数据是一个较为高级的功能,在Oracle9i版本中得到了支持。本节将介绍如何使用`MERGE`语句来合并来自不同源的数据到目标表中。这通常用于数据同步或更新场景。 #### 1.8 事务管理 事务管理是确保数据一致性和...
Oracle Solaris 11.2 是一款由Oracle公司开发的高级操作系统,专为数据中心和企业级应用设计。本文将深入探讨如何创建和管理Oracle Solaris 11.2的启动环境(Boot Environments,简称BE),这是一个关键特性,允许...
SQL在Oracle中的应用涵盖了数据查询、插入、更新和删除,以及更复杂的DML操作如合并(MERGE)和批量插入(BULK COLLECT)。SQL的高级特性,如子查询、联接(JOIN)、集合操作(UNION, INTERSECT, EXCEPT)和窗口函数...
此外,书中还涉及到了ORACLE数据库的安装、存储过程的编写、序列操作、数据类型转换、程序设计指导原则、合并数据库中的数据行(MERGE)、约束、索引、子查询、分页技术等高级主题。 最后,还有关于字符串、数值、...
5. **Mergeinto应用** - **解释**: 用于合并数据到目标表。 - **应用场景**: 数据整合。 6. **Truncatetable** - **解释**: 清空表中的所有数据。 - **应用场景**: 数据清理。 7. **绑定变量与非绑定变量之...
Oracle数据库复制软件iStream DDS是一种高级的数据保护和灾难恢复解决方案,特别针对实现实时数据复制和容灾需求而设计。DDS,全称为Data Duplication Service,它提供了一种高效、可靠的方法来确保关键业务数据在主...
Oracle Enterprise Manager Grid Control提供了一站式管理平台,可以监控和管理整个Oracle环境,包括数据库、应用服务器和硬件资源。 通过深入学习Oracle10g参考手册,用户不仅能掌握数据库的基本操作,还能了解到...
SCP(Software Configuration Package)Merge Modules则为这种集成提供了方便,它们包含MapXtreme 2008的特定组件,可以无缝地与其他软件包合并,确保安装过程中所有必要的依赖项都被正确处理。 "MapInfoWeb_6.8.0....
Oracle Solaris 11.3 是一款由Oracle公司开发的高级操作系统,专为现代数据中心和企业环境设计。本文将深入探讨在Oracle Solaris 11.3中创建和管理启动环境(Boot Environment, BE)的关键知识点。 启动环境是...
Oracle分区表是数据库管理系统Oracle中的一种高级特性,用于优化大规模数据的存储和管理。通过将一个大表分成多个较小的部分,每个部分(分区)可以独立管理和操作,从而提高查询性能,减少维护成本,并且便于数据的...