<update id="addMarkChild" parameterType="java.util.HashMap">
MERGE INTO t_kpi_simu_detail_person dp
USING (select #{simu_detail_id,jdbcType=VARCHAR} as simu_detail_id,
#{person_id,jdbcType=VARCHAR} as person_id,
#{mark,jdbcType=VARCHAR} as mark
from dual) c
ON (dp.simu_detail_id = c.simu_detail_id and dp.person_id = c.person_id)
WHEN MATCHED THEN
UPDATE SET dp.mark = c.mark
WHEN NOT MATCHED THEN
INSERT
(obj_id, simu_detail_id, person_id, mark)
VALUES
((select sys_guid() from dual), c.simu_detail_id, c.person_id, c.mark)
</update>
表1:t_kpi_simu试卷创建表(下图)
mark是试卷总分999
表2:t_kpi_simu_person考试参与人员与得分表(这个试卷有两个小题)
sumi_id是试卷的ID
person_id是参与考试人的id
mark是考试人此次考试的总得分(638)------即表3同一个人同一份试卷内各个小题相加得分之和
表3:t_kpi_simu_detail_person是此考试人答题的小题得分表(这个试卷有两个小题)
simu_detail_id是小题id
person_id是参与考试人的id
mark是此小题得分。(此表中的数据就是用merge into语句插入的)
meger into 语句的用法以本题为例是:
1.在表1中创建一份试卷并包含参与考试人员的id
2.通过关联表1考试人员的id,在表2中创建表1试卷内的小题,从而得到表2(表2中的mark创建时是null的,用了nvl(mark,0),将会利用到meger into语句。
3.通过后台和前台关联。利用merge into 语句,
若答题者未答题则在表3中不存在任何数据,即插入各小题得分,若表3存在数据,修改小题分数即可更新。
即可认为是:若满足套件则更新数据,若不存在即插入数据