Oracle中Merge into用法总结
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
语法:
MERGE INTO [your table-name] [rename your table here]
USING ( [write your query here] )[rename your query-sql and using just like a table]
ON ([conditional expression here] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ]
WHEN NOT MATHED THEN [execute something else here ! ]
Oracle 10g中MERGE有如下一些改进:
1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的
这里说一下我自己的理解:
第一点意思是可以在MERGE INTO语法中只写WHEN MATCHED THEN或者只写WHEN NOT MATCHED THEN。这里不再赘述。
第二点意思是我们可以在THEN后的UPDATE或者INSERT语句后面加上WHERE条件,比如有这样的需求:当A表中的ID在B表中不存在时进行插入。当存在时,A表的NAME不为空时进行更新。这种情况就需要在UPDATE字句后+WHERE条件。
第三点意思是我们可以在ON条件中不进行目标表和USING表的关联,可以在ON条件中写如1=1这样的条件。比如我们有这样的需求:当isAllAdd参数为false时,进行正常的MERGE INTO。当isAllAdd参数为true时,全部执行插入。我们就可以使用这个新特性,对ON中的条件进行筛选从而达到一条sql即可满足业务的目的。
第四点意思是我们不止可以在MERGE INTO中进行插入更新,还可以对匹配的数据进行删除操作。这个点非常重要,个人认为第四点是这次改进中最需要我们学习的一点。比如我们有这样的需求:A表中有期中学生ID,考试年份、考试成绩、期末考试成绩四个字段。我们给期末考试成绩做批量删除功能,当没有期中考试成绩时,删除该数据。当有期中考试成绩时,将期末考试成绩置空。传统写法将需要删除的人员的List中的信息其数据库进行查询,看其中的每一条是执行修改还是删除,在分别调用。我们现在只需要
MERGE INTO A
USING (TABLE EMPLOYEE) B
ON (A.EMPLOYEEID = B.EMPLOYEEID AND A.YEAR = B.YEAR)
WHEN MATCHED THEN
UPDATE SET 期中考试成绩 = ""
DELETE WHERE 期末考试成绩 IS NULL
特别说明:
DELETE字句只能写在MATCHED情况中,不匹配时无法删除会报错。
当DELETE跟在UPDATE字句之后时,DELETE字句是针对UPDATE字句修改后的数据进行过滤的。比如需要删除所有C字段="1"的数据,UPDATE字句将所有数据的C字段都更新为1,那么会删除所有数据,而不是原本为1的数据。
Oracle中Merge into用法总结的更多相关文章
- oracle中merge的用法,以及各版本的区别 Create
Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key. Oracle在9i引入了merge命令,通过这个merge你能够在一个SQL语句中对一个 ...
- oracle中merge into用法解析
merge into的形式: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] an ...
- SQL2008中Merge的用法
在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...
- SQL2008中Merge的用法(轉載)
在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...
- SQL2008中Merge的用法(转)
在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- Oracle中group by用法
Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用聚组函数返回的是每一个组的汇总 ...
- Oracle中merge into的使用
http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5 ...
- SQL中Merge的用法
SQL中Merge的用法 Merge的用法 Merge可以完成以下功能: 1. 两个表之间数据的更新 2. 进行进销存更新库存 3. 进行表之间数据的复制 语法说明: 1. 在语句结束后一定要 ...
随机推荐
- Android静默安装实现方案
之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢?所谓的静默安装,就是不用弹出系统的安装界面,在不影响用户任何操作的情况下不知不觉地将程序装好.虽说这种方式看上去不打搅用户,但是却 ...
- 。tar.gz(bz或bz2等)安装
tar.gz(bz或bz2等) 一.安装1.打开一个SHELL,即终端2.用cd 命令进入源代码压缩包所在的目录3.根据压缩包类型解压缩文件(*代表压缩包名称)tar -zxvf ****.tar.g ...
- 【翻译】利用Qt设计师窗体在运行时创建用户界面(Creating a user interface from a Qt Designer form at run-time)
利用Qt设计师窗体在运行时创建用户界面 我们利用Calculator窗体例子中创建的窗体(Form)来展示当一个应用(application)已经生成后,是可以在其运行时产生与例子中相同的用户界面. ...
- memcached安装
memcached安装 一.安装gcc # yum -y install gcc 二.安装libevent # wget http://www.monkey.org/~provos/libevent- ...
- Git初步学习
版本控制系统version control system 多人协作开发 历史记录 恢复到任意历史版本-代码状态 错误恢复 多功能并行开发 版本控制系统分类: 本地版本控制系统---------个人计算 ...
- [python]python中,使用traceback处理异常信息
近来编写一个程序,该程序可以在设定时间内,获取指定文件夹更新的文件夹和文件列表,并根据获取到的更新列表,做一些操作.由于所写程序是放在服务器上运行,为了保证程序在运行的过程中,不时不时跳出些异常信息出 ...
- 读文章《Flexbox详解》笔记
文章地址:Flexbox详解 属性摘抄: flex container : display: other values | flex | inline-flex; flex-direction: ro ...
- 最新榜单!消金企业TOP10,数据、风控、催收服务方TOP5
最新榜单!消金企业TOP10,数据.风控.催收服务方TOP5 布谷TIME2016-12-15 17:47:59消费 风控阅读(164)评论(0) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账 ...
- Win10无法安装提示磁盘布局不受UEFI固件支持怎样解决
微软在推出Win10系统以后,就向Win7和Win8.1系统用户提供了免费升级Win10系统的推送,但是用户在安装Win10系统的时候,却有一部分用户反映,遇到提示“无法安装Windows,因为这台电 ...
- SQL Server 2012 联机丛书安装
已连接 Internet 的计算机: 单击"管理帮助设置"启动帮助库管理器. 在 Windows 7 中,依次选择"开始"."所有程序".& ...