Oracle merge合并更新函数实例详解
作者:smileNicky 发布时间:2023-07-23 02:45:02
标签:oracle,merge,合并
前言
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。通过这个MERGE你能够在一个SQL语句中对一个表同时执行INSERT和UPDATE操作.
本博客介绍一下Oracle merge合并函数,业务场景:新增数据的时候要先查询数据库是否已经有改数据,有数据就更新数据,没数据才新增数据,这是很常见的业务场景,如果是用Oracle数据库的话,其实直接用merge函数效率更快,而且merge函数性能也相对比较好
merge函数的语法:
MERGE INTO table_name alias1
USING (table|view|sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name
SET col1 = col_val1,
col2 = col_val2
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);
举个例子:
SQL实现,意思是有数据就更新,没数据才新增
MERGE INTO t_config_related A1 USING(select '97547758-6f85-419e-85f9-b8f711ca2660' seq,
'97547758-6f85-419e-85f9-b8f711ca2658' tipsSeq,
to_number('1') appLevel,
'24e1ccc38d9542189d1cc6c23f814a18' relaSeq from dual) A2
ON(A1.seq = A2.seq)
WHEN MATCHED THEN
UPDATE SET
A1.tips_seq = A2.tipsSeq,
A1.app_level = A2.appLevel,
A1.rela_seq = A2.relaSeq
WHEN NOT MATCHED THEN
INSERT(seq , tips_seq , app_level , rela_seq)
VALUES(A2.seq , A2.tipsSeq , A2.appLevel , A2.relaSeq);
/**
* 批量更新保存地区关联信息
* @date 2019年2月21日上午11:17:10
* @return
*/
@RequestMapping("/batchSaveTipsAreaConfig")
@ResponseBody
public ResultModel batchSaveTipsConfig(ApprTipsRelatedModel relatedModel) {
List<ApprTipsRelatedModel> areaTipsList = new ArrayList<ApprTipsRelatedModel>();
//封装批量更新的地区列表
String[] areaSeqs = StringUtils.split(relatedModel.getAreaSeq(),",");
for (String areaSeq : areaSeqs) {
ApprTipsRelatedModel areaRelatedModelNew = new ApprTipsRelatedModel();
areaRelatedModelNew.setSeq(commonService.generateUUID());
areaRelatedModelNew.setTipsSeq(relatedModel.getTipsSeq());
areaRelatedModelNew.setAppLevel(NumConstant.COMMON_NUM_TREE);
areaRelatedModelNew.setRelaSeq(areaSeq);
areaTipsList.add(areaRelatedModelNew);
}
//批量更新新增数据
try {
this.tipsConfigService.batchSaveTipsRelatedConfig(areaTipsList);
return ResultModel.success("保存成功");
} catch(Exception e) {
logger.error("批量绑定地区异常:{}"+e);
throw new SuperControllerException();
}
}
注意要点:
在开发中我遇到一个异常,mybatis打印出来的SQL是这样的:
Preparing: MERGE INTO appr_tips_config_related A1 ? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ? WHEN MATCHED THEN ? ? UPDATE SET A1.seq = A2.seq, A1.tips_seq = A2.tipsSeq, A1.app_level = A2.appLevel, A1.rela_seq = A2.relaSeq ? ? ?WHEN NOT MATCHED THEN ? ? ?INSERT(seq,tip_seq,app_level,rela_seq) ? ? ? ? VALUES(A2.seq , A2.tipsSeq , A2.appLevel , A2.relaSeq)
可以看出什么问题?打印出的SQL有很多问号,那是因为SQL有空格导致的,所以使用merge函数不用随便加空格,不然会报错的
? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ?
来源:http://www.cnblogs.com/mzq123/p/10424506.html


猜你喜欢
- UUID(Universally Unique Identifier)是通用唯一识别码,在许多领域用作标识,比如我们常用的数据库也可以用它来
- pytorch中基本的变量类型当属FloatTensor(以下都用floattensor),而Variable(以下都用variable)是
- 同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月My
- 今天有碰到这种情况,数据库中有张表没办法通过migration来更改, migrate时报 django.db.utils.Operatio
- 1. 问题描述:同目录下,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的模块,PyCharm中提示No Module.2
- 如下所示:update-alternatives --config python一条简单的命令,如下图所示:来源:https://blog.
- 概述今天主要分享下mysql数据库应该如何正确的删除binlog日志,这里要注意不要强制使用rm命令进行清除。否则mysq-bin.inde
- 问题你想改变对象实例的打印或显示输出,让它们更具可读性。解决方案要改变一个实例的字符串表示,可重新定义它的 __str__() 和 __re
- 测试的php文件 <?php $link=mysql_connect('localhost','root
- 新手刚开始使用vue时,常会遇见一个坑,那就是热替换失效。什么?你跟我说使用官方的vue-cli去构建,我就是使用vue-cli后突然失效。
- 本文实例为大家分享了vue更多筛选项小组件的实现方法,供大家参考,具体内容如下效果:就是一个简单的小效果,当有很多筛选条件时,默认只展示几项
- 很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转。。。这个着急也只有当事人才明
- python可以在处理各种数据时,如果可以将这些数据,利用图表将其可视化,这样在分析处理起来,将更加直观、清晰,以下是 利用 PyEchar
- 大家都知道当任务过多,任务量过大时如果想提高效率的一个最简单的方法就是用多线程去处理,比如爬取上万个网页中的特定数据,以及将爬取数据和清洗数
- --利用T-SQL语句,实现数据库的备份与还原的功能 ----体现了SQL Server中的四个知识点: ----1. 获取SQL Serv
- 本文实例讲述了Python实现向服务器请求压缩数据及解压缩数据的方法。分享给大家供大家参考,具体如下:向服务器请求压缩数据格式,并解压缩数据
- 本文实例为大家分享了React实现表格选取的具体代码,供大家参考,具体内容如下在工作中,遇到一个需求,在表格中实现类似于Excel选中一片区
- table通过使用下面语句创建:create table userinfo(name text, email text)更快地插入数据在此用
- 本文实例讲述了python实现的AES双向对称加密解密与用法。分享给大家供大家参考,具体如下:高级加密标准(Advanced Encrypt
- 一、查询当前部门下的所有子部门WITH dept AS ( SELECT *