C/C++教程

2021-05-21 Oracle Merge Into 更新表数据

本文主要是介绍2021-05-21 Oracle Merge Into 更新表数据,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Merge into

使用版本: Oracle 9 及以上版本
作用:

在平常更新表数据时 有时候需要判断存在记录就更新数据,不存在则插入记录,我们需要先判断数据是否存在,需要两条sql, 现在使用merge into 就可以一条sql解决 更新数据和插入数据的问题了

语法
 merge into  t1  -- 要更新数据的目标表
 using  t2       -- 要用来更新目标表数据的源表
 on (条件)  -- 目标表与源表的查询结果
 when matched then update set t1.column1=t2.column2 -- 表1中 存在符合条件的记录 更新语句t1表的字段
 when not matched then insert t1(id,sc) values(t2.id,t2.sc) --表2中不存在符合条件的记录 执行插入操作 向t1表中插入操作
实际应用

存在学生成绩表 sc (id 主键id, sid 学生编号, score 学生成绩)
学生成绩统计表sc_tj(sid 学生编号,sum 成绩总和 )
现在需要将学生成绩表的每个学生的成绩综合 统计到成绩统计表, 现在统计表有的学生成绩是存在的,如果存在的学生记录就 将学生成绩表的成绩 加到原有记录中,如果没有的记录就插入数据

实现sql如下

merge into sc_tj t1 
using (select sid,sum(score) score from sc group by sid ) t2
on(t1.sid=t2.sid)
when matched then update set sum=t1.sum+t2.score
when not matched then insert t1(sid,sum) values(t2.sid,t2.score)

注意事项:

用merge的时候大概有3个地方需要注意

  • 如果using中的语句查询不出来数据,是不会执行insert方法的,因为这个语法是根据using 中的查询数据进行判断

2:语句写的时候on 中的条件记得过滤准确,不然可能会执行全表更新

3:on 中的条件不能是更新操作列,不然会报错:ora-38104

merge into sc_tj t1 
using (select sid,sum(score) score from sc group by sid ) t2
on(t1.sid=t2.sid)
when matched then update set sid='111'
when not matched then insert t1(sid,sum) values(t2.sid,t2.score)

在匹配条件里用了sid 字段,就不能在更新操作时 进行修改sid字段

本文参考 https://www.jianshu.com/p/8f51ce60d9ba 如有侵权,请联系本人进行删除
这篇关于2021-05-21 Oracle Merge Into 更新表数据的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!