`

Oracle高级应用之合并MERGE

    博客分类:
  • db
 
阅读更多

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

 

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

 

  1. create table merge_test as select * from scott.dept  

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

  1. delete from merge_test t where t.deptno=10  

 

  1. update merge_test t set t.dname = 'TEST'  

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

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

  1. delete from merge_test  

 

  1. insert into merge_test select * from scott.dept  

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

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

  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。

  1. insert into merge_test m  
  2.   select *  
  3.     from scott.dept  
  4.    where deptno not in (select deptno from merge_test)  

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

  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语句如下:

  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 语句如下:

  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新增的。

 

原文地址:http://blog.csdn.net/fu0208/article/details/8812536

分享到:
评论

相关推荐

    Oracle高级sql学习与练习

    Oracle高级SQL学习与练习涵盖了数据库编程中的一系列高级主题,旨在帮助数据库开发者和管理员提高解决复杂问题的能力。在Oracle数据库系统中,高级SQL技能是进行高效数据管理、查询优化和复杂数据处理的基础。 1. ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    Oracle数据库应用开发——数据操作与PLSQL程序设计实验报告.docx

    - **合并(Merge)**: Oracle的`MERGE`语句用于实现“更新插入”,当两个表结构一致时,根据匹配条件更新或插入数据。 2. **查询操作**: - **简单查询(Select)**: 使用`SELECT * FROM`获取表的所有记录,或者`...

    oracle高级复制 - 多主复制

    Oracle提供了一种称为“多路归并”(Multimaster Merge)的解决方案,它能够合并来自多个源的更改,处理潜在的冲突。配置多节点复制涉及上述双节点配置的扩展,包括更多的发布者和订阅者,以及更复杂的冲突解决策略...

    [Oracle.SQL高级编程].Karen.Morton等.扫描版

    1. 数据操纵语言(DML):在Oracle SQL中,可以使用INSERT、UPDATE、DELETE和MERGE语句对数据进行增加、修改、删除和合并操作。 2. 数据定义语言(DDL):用于定义数据库对象(如表、视图、索引、序列等)的结构。...

    oracle资源大全

    8. **merge into 用法.txt**:MERGE INTO是Oracle中的一个高级DML操作,用于合并数据源,实现更新或插入,根据特定条件决定是更新已有记录还是插入新记录。 通过学习这些资料,不仅可以掌握Oracle的基础操作,还能...

    Oracle11G数据库学习笔记

    这篇学习笔记主要涵盖了Oracle11g的基础知识,包括服务、SQL*Plus命令以及网络配置等方面,同时也提到了一些高级特性如`MERGE INTO`和`INSERT ALL`的使用。 首先,Oracle11g包含了一些关键服务,如`...

    oracleOcp课程大纲

    6. 探索高级SQL查询技术,如合并查询(MERGE)、并集(UNION ALL)、交集(INTERSECT)、差集(MINUS),以及GROUP BY、ROLLUP、CUBE等聚合函数,提升数据提取效率。 7. 学习编写SQL脚本,生成报表样式的输出结果,...

    剑破冰山 Oracle开发艺术

    8. Oracle层次查询:层次查询是Oracle数据库特有的查询类型,用于处理层级数据,本书将提供层次查询的使用技巧和高级应用。 9. 递归WITH编程:递归WITH子句是Oracle 11gR2引入的新特性之一,用于简化递归查询,本书...

    oracle从入门到精通

    Oracle数据库是全球领先的数据库管理系统之一,由甲骨文公司(Oracle Corporation)开发。它支持大型数据库,并且在数据管理、备份和恢复、安全性、并发控制以及事务管理方面表现出色,广泛应用于企业级应用中。...

    Oracle SQL*Plus Pocket Reference, 2nd Edition

    合并数据是一个较为高级的功能,在Oracle9i版本中得到了支持。本节将介绍如何使用`MERGE`语句来合并来自不同源的数据到目标表中。这通常用于数据同步或更新场景。 #### 1.8 事务管理 事务管理是确保数据一致性和...

    Oracle Solaris 11.2 Creating and Administering Oracle Solaris 11

    Oracle Solaris 11.2 是一款由Oracle公司开发的高级操作系统,专为数据中心和企业级应用设计。本文将深入探讨如何创建和管理Oracle Solaris 11.2的启动环境(Boot Environments,简称BE),这是一个关键特性,允许...

    oracle DATABASE 开发指南附件

    SQL在Oracle中的应用涵盖了数据查询、插入、更新和删除,以及更复杂的DML操作如合并(MERGE)和批量插入(BULK COLLECT)。SQL的高级特性,如子查询、联接(JOIN)、集合操作(UNION, INTERSECT, EXCEPT)和窗口函数...

    ORACLE PL/SQL从入门到精通

    此外,书中还涉及到了ORACLE数据库的安装、存储过程的编写、序列操作、数据类型转换、程序设计指导原则、合并数据库中的数据行(MERGE)、约束、索引、子查询、分页技术等高级主题。 最后,还有关于字符串、数值、...

    OracleEBS开发汇总文档

    5. **Mergeinto应用** - **解释**: 用于合并数据到目标表。 - **应用场景**: 数据整合。 6. **Truncatetable** - **解释**: 清空表中的所有数据。 - **应用场景**: 数据清理。 7. **绑定变量与非绑定变量之...

    oracle复制软件介绍ppt

    Oracle数据库复制软件iStream DDS是一种高级的数据保护和灾难恢复解决方案,特别针对实现实时数据复制和容灾需求而设计。DDS,全称为Data Duplication Service,它提供了一种高效、可靠的方法来确保关键业务数据在主...

    Oracle10g参考手册

    Oracle Enterprise Manager Grid Control提供了一站式管理平台,可以监控和管理整个Oracle环境,包括数据库、应用服务器和硬件资源。 通过深入学习Oracle10g参考手册,用户不仅能掌握数据库的基本操作,还能了解到...

    MapXtreme 2008 SCP Merge Modules(7)

    SCP(Software Configuration Package)Merge Modules则为这种集成提供了方便,它们包含MapXtreme 2008的特定组件,可以无缝地与其他软件包合并,确保安装过程中所有必要的依赖项都被正确处理。 "MapInfoWeb_6.8.0....

    Oracle Solaris 11.3 Creating and Administering Oracle Solaris 11

    Oracle Solaris 11.3 是一款由Oracle公司开发的高级操作系统,专为现代数据中心和企业环境设计。本文将深入探讨在Oracle Solaris 11.3中创建和管理启动环境(Boot Environment, BE)的关键知识点。 启动环境是...

    Oracle分区表学习及应用.doc

    Oracle分区表是数据库管理系统Oracle中的一种高级特性,用于优化大规模数据的存储和管理。通过将一个大表分成多个较小的部分,每个部分(分区)可以独立管理和操作,从而提高查询性能,减少维护成本,并且便于数据的...

Global site tag (gtag.js) - Google Analytics