Oracle merge into语句(merge into Statement)

2024-07-11 1432阅读

在Oracle中,常规的DML语句只能完成单一功能,,例如insert/delete/update只能三选一,而merge into语句可以同时对一张表进行更新/插入/删除。

目录

一、基本语法

二、用法示例

2.1 同时更新和插入

2.2 where子句

2.3 delete子句

2.4 记录同步错误


一、基本语法

merge into常用在数据同步的场景,它会选定一张基表作为数据源,然后与目标表的记录进行匹配,根据匹配的结果,可以对目标表同时进行更新/插入/删除操作。

语法:

MERGE INTO target_table
USING source_table ON (join_condition)
WHEN MATCHED THEN UPDATE SET … [WHERE …] [DELETE … WHERE …]
WHEN NOT MATCHED THEN INSERT (column_list) VALUES (value_list) [WHERE …]
LOG ERRORS INTO … REJECT LIMIT [integer|UNLIMITED]
  • target_table 是要更新的表
  • source_table 是参考表
  • USING … ON () 是两个表的连接条件,用于判断记录是否匹配
  • WHEN MATCHED 对于满足匹配条件的记录进行的操作,可以更新或删除
  • WHEN NOT MATCHED 对于不满足匹配条件的记录,可以插入
  • LOG ERRORS INTO 可以将匹配错误的记录记录到日志表中

    二、用法示例

    先创建2张表,一张源表,一张目标表:

    create table src_table(
    id number(6),
    name varchar2(32),
    salary number(6),
    bonus number(6));
    insert into src_table values(1,'Vincent',1000,100);
    insert into src_table values(2,'Victor',2000,200);
    insert into src_table values(3,'Grace',3000,300);
    create table tgt_table(
    id number(6),
    name varchar2(32),
    age number(6),
    salary number(6),
    bonus number(6));
    insert into tgt_table values(1,'someone',1,0,0);
    insert into tgt_table values(3,'someone',3,0,0);
    insert into tgt_table values(4,'someone',4,0,0);
    commit;

    两张表的数据如下:

    Select * from src_table;
    Select * from tgt_table;

    Oracle merge into语句(merge into Statement)

    2.1 同时更新和插入

    下面是最基本的用法,利用源表对目标表同时进行更新和插入

    merge into tgt_table t
    using src_table s on (t.id=s.id)
    when matched then update set t.name=s.name, t.salary=s.salary, t.age=10
    when not matched then insert values(s.id,s.name,10,s.salary,s.bonus+50);
    commit;
    select * from tgt_table;

    Oracle merge into语句(merge into Statement)

    • When matched 为匹配存在的记录(id为1,3),更新了name, salary, age个字段
    • When not match 为目标表不存在的记录(id为2),插入了该记录,同时bouns字段加50
    • Matched 和 not matched的子句是独立的,可以任意选择一项,或同时出现
    • 目标表中id为4的记录在源表中不存在(不满足连接条件),因此不会涉及

      2.2 where子句

      对于匹配的记录,可以使用where子句进一步限制范围

      merge into tgt_table t
      using src_table s on (t.id=s.id)
      when matched then update set t.bonus=s.bonus where s.id>=2;
      Select * from tgt_table order by id;

      Oracle merge into语句(merge into Statement)

      • 这里对匹配的记录bonus字段进行更新,同时进一步限制id>=2的记录才更新
      • Where 子句的条件可以通过源表或者目标表指定,这里是通过源表的s.id指定

        2.3 delete子句

        在update子句后,还可以跟上delete … where …子句,对匹配上的记录进行删除操作

        merge into tgt_table t
        using src_table s on (t.id=s.id)
        when matched then update set t.bonus=s.bonus+50 where s.id>=3 delete where id>=2;
        select * from tgt_table order by id;

        Oracle merge into语句(merge into Statement)

        • delete where id>=2 指定将ID大于等于2的记录删除,但注意id为2的记录并未被删除,只有3被删除了
        • 因为delete只会在update匹配的到记录范围内删除,update子句有个where s.id>=3,delete也会受到这个条件的限制
        • 实际执行的效果是 delete where s.id>=3 and id>=2,只有id为3的记录满足这个条件
        • id为4的记录不在匹配范围内,不受merge into语句的影响,也不会被删除

          2.4 记录同步错误

          数据同步的时,源表和目标表的结构/数据类型/约束可能并不一致,这就导致数据同步可能部分失败,现在我们修改tgt表,限制salary字段值不能超过3000,即插入超过3000的数字将失败:

          Alter table tgt_table modify salary number(6) check(salary
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]