在平常更新表数据时 有时候需要判断存在记录就更新数据,不存在则插入记录,我们需要先判断数据是否存在,需要两条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个地方需要注意
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
如有侵权,请联系本人进行删除