Bootstrap

MERGE INTO用法更新和插入多条子记录

<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存在数据,修改小题分数即可更新。

即可认为是:若满足套件则更新数据,若不存在即插入数据

;