Oracle存在则更新,不存在则插入应用-merge

Oracle在9i引入了merge命令,

通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表

MERGE INTO table_name alias1 
USING (table|view|sub_query) alias2
ON (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);

在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。

因此,严格意义上讲,“在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。”

实例:

T有a、b两个字段 a是主键。现在有记录(1001,2)要保存到T中,T中如果已经存在则更新字段b,没有插入。


MERGE INTO T T1

USING (SELECT '1001' AS a,2 AS b FROM dual) T2

ON ( T1.a=T2.a)

WHEN MATCHED THEN

  UPDATE SET T1.b = T2.b

WHEN NOT MATCHED THEN 

  INSERT (a,b) VALUES(T2.a,T2.b);




实例:

mybatist 中的sql:

  <insert id="mergeInto"  >

    MERGE INTO CATEGORY_EXPERT_GRADE  T1
    USING ( select ${categoryFk} as a, ${expertFk} as b  FROM dual) T2
    ON ( T1.CATEGORY_FK=T2.a and T1.EXPERT_FK=T2.b)
    WHEN MATCHED THEN
    UPDATE SET T1.GRADE = #{grade,jdbcType=VARCHAR}
    WHEN NOT MATCHED THEN
    insert   (PK, CATEGORY_FK, EXPERT_FK,GRADE, SAVE_DATE, FLAG,EXTEND1, EXTEND2, EXTEND3)
    values (Sequence_Shzj.nextval, #{categoryFk,jdbcType=DECIMAL}, #{expertFk,jdbcType=DECIMAL},
    #{grade,jdbcType=VARCHAR}, #{saveDate,jdbcType=DATE}, #{flag,jdbcType=DECIMAL},
    #{extend1,jdbcType=VARCHAR}, #{extend2,jdbcType=VARCHAR}, #{extend3,jdbcType=VARCHAR}
    )

  </insert>




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值