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

转:

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

2017年01月11日 14:15:26 周星猩 阅读数 11354更多

分类专栏: Oracle

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/hong10086/article/details/54342819

Oracle在9i引入了merge命令,

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

  1. MERGE INTO table_name alias1
  2. USING (table|view|sub_query) alias2
  3. ON (join condition)
  4. WHEN MATCHED THEN
  5. UPDATE table_name
  6. SET col1 = col_val1,
  7. col2 = col_val2
  8. WHEN NOT MATCHED THEN
  9. 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,没有插入。

  1. MERGE INTO T T1
  2.  
  3. USING (SELECT ‘1001‘ AS a,2 AS b FROM dual) T2
  4.  
  5. ON ( T1.a=T2.a)
  6.  
  7. WHEN MATCHED THEN
  8.  
  9. UPDATE SET T1.b = T2.b
  10.  
  11. WHEN NOT MATCHED THEN
  12.  
  13. INSERT (a,b) VALUES(T2.a,T2.b);

实例:

mybatist 中的sql:

    1. <insert id="mergeInto" >
    2.  
    3. MERGE INTO CATEGORY_EXPERT_GRADE T1
    4. USING ( select ${categoryFk} as a, ${expertFk} as b FROM dual) T2
    5. ON ( T1.CATEGORY_FK=T2.a and T1.EXPERT_FK=T2.b)
    6. WHEN MATCHED THEN
    7. UPDATE SET T1.GRADE = #{grade,jdbcType=VARCHAR}
    8. WHEN NOT MATCHED THEN
    9. insert (PK, CATEGORY_FK, EXPERT_FK,GRADE, SAVE_DATE, FLAG,EXTEND1, EXTEND2, EXTEND3)
    10. values (Sequence_Shzj.nextval, #{categoryFk,jdbcType=DECIMAL}, #{expertFk,jdbcType=DECIMAL},
    11. #{grade,jdbcType=VARCHAR}, #{saveDate,jdbcType=DATE}, #{flag,jdbcType=DECIMAL},
    12. #{extend1,jdbcType=VARCHAR}, #{extend2,jdbcType=VARCHAR}, #{extend3,jdbcType=VARCHAR}
    13. )
    14.  
    15. </insert>

原文地址:https://www.cnblogs.com/libin6505/p/11528848.html

时间: 2024-07-30 15:27:49

Oracle存在则更新,不存在则插入应用-merge的相关文章

3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的区别,sql文件导入

 1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert update delete select DDL语言 (Date definition Language) 数据库定义语言 create table;create view index sequence synonvm同义词,truncate table DCL语言 (Data control Language) 数据控制语言 commit rollback s

Oracle游标循环更新数据案例

declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZJZJRQ AS ZJZJZJRQ FROM XTXMXX XT, QJGLXX_ZQL_MID QJ WHERE XT.XTXMBH = QJ.XTXMBH AND XT.XTXMCLRQ >= '20120630' AND (QJ.ZJQHZJRQ IS NULL OR QJ.ZJZJZJRQ

sql mysql和sqlserver存在就更新,不存在就插入的写法(转)

转自:http://hi.baidu.com/tidy0608/item/ff930fe2436f2601560f1dd9 sqlsever数据存在就更新,不存在就插入的两种方法 两种经常使用的方法: 1. Update, if @@ROWCOUNT = 0 then insert UPDATETable1 SETColumn1 = @newValue WHEREId = @id [email protected]@ROWCOUNT= 0 BEGIN INSERT INTOTable1 (Id,

oracle 表误更新 (flashback )闪回操作

--oracle  表误更新  闪回操作 测试环境 --select * from v$database; --select * from v$version; 操作第一步 1.如下命令启用行迁移 alter table test_a enable row movement; 2.如下命令闪回到某时间点 flashback table test_a to timestamp to_timestamp('2012-05-31 16:20:30', 'yyyy-mm-dd hh24:mi:ss');

使用LKDBHelper 插入相同id时候应该是更新数据而不是插入新的数据

要实现使用LKDBHelp 插入相同id时候应该是更新数据而不是插入新的数据 例如#import "JSONModel.h" @interface InfoModel : JSONModel @property (nonatomic,copy)NSString *name; @property (nonatomic,copy)NSString *age; @property (nonatomic,copy)NSString *sex; @property (nonatomic,copy

oracle表之间的连接之------&gt;排序合并连接(Merge Sort Join)

排序合并连接 (Sort Merge Join)是一种两个表在做连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的连接方法. 对于排序合并连接的优缺点及适用场景如下: a,通常情况下,排序合并连接的执行效率远不如哈希连接,但前者的使用范围更广,因为哈希连接只能用于等值连接条件,而排序合并连接还能用于其他连接条件(如<,<=,>.>=) b,通常情况下,排序合并连接并不适合OLTP类型的系统,其本质原因是对于因为OLTP类型系统而言,排序是非常昂贵的操作,当然,如

Oracle利用触发器更新插入时某一列的值

先创建一个表Brzl 其中Pym是Brxm的首字母拼音 新建触发器前简单备注下触发器创建方法 create [or replace] tigger 触发器名 触发时间 触发事件 on 表名 [for each row] begin pl/sql语句 end 其中: 触发器名:触发器对象的名称.由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途. 触发时间:指明触发器何时执行,该值可取: before:表示在数据库动作之前触发器执行; after:表示在数据库动作之后触发器执行.

Oracle中用随机数更新字段----将一张表的数据插入另一张表----环境设置

DECLARE CURSOR recordCursor IS SELECT longitude,latitude FROM WR_WIUST_B_SEC FOR UPDATE; recordRow recordCursor % ROWTYPE; BEGIN OPEN recordCursor; LOOP FETCH recordCursor INTO recordRow; IF recordCursor % NOTFOUND THEN EXIT; ELSE UPDATE WR_WIUST_B_S

oracle数据库,覆盖插入数据---- merge into

在开发中我们经常会碰到这么一个场景,列如用户修改简单的个人基本信息,这个时候就需要判断用户的基本信息是否存在,如果是首次录入不存在就在表中插入一条信息,如果存在就更新表里的信息. 要实现这种这种场景很简单,我们最常用的就是先查询一下用户的基本信息,执行一下select方法,如果数据存在就执行update方法,如果不存在就就执行insert 方法.这是一种解决思路. 当只是很简单的条件判断时,我们也有另外一种数据库层面的解决思路就是merge into ,很多数据库都有这种语句,因为我用的orac