Oracle merge合并更新函数实例详解
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,前言MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,
千家信息网最后更新 2025年11月07日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) alias2ON (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) A2ON(A1.seq = A2.seq)WHEN MATCHED THENUPDATE SET A1.tips_seq = A2.tipsSeq, A1.app_level = A2.appLevel, A1.rela_seq = A2.relaSeqWHEN NOT MATCHED THENINSERT(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 areaTipsList = new ArrayList(); //封装批量更新的地区列表 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 ? ? ?) ?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
数据
函数
更新
语句
地区
语法
查询
业务
内容
场景
效率
数据库
条件
学习
工作
成功
不用
价值
例子
信息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库的建立步骤
川师软件开发
如何去美国做软件开发
远程服务器不能用怎么办
8e数据库q绑
如何管理阿里云服务器
新一代云网运营体系的数据库
电影数据库小程序
非永久的数据库连接
互联网到底有多少科技含量
nbog物流网络技术
新泰六度网络技术有限公司
网站服务器租用还是买
服务器系统如何开通远程协助
mysql融合数据库
创造与魔法可以换什么服务器
网络安全2020方向
网络安全数据格式剥离
成都前端软件开发需要多少钱
时钟服务器的两种协议
如何禁止员工服务器上传文件
川师软件开发
bt代理服务器
关注网络安全的事情
乌班图服务器版怎么分区
公积金管理中心连接服务器出错
金蝶专业版数据库修改成混合验证
服务器自动关机怎么查原因
互联网用户分析科技
网络安全与管理中级