欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

存在时更新 不存在时新增:merge into using(071问题)

程序员文章站 2022-07-07 09:18:08
merge into using在写数据同步的脚本时,常常会遇到这样的需求:存在时 -> 更新,不存在时 -> 插入。-- 源表 aCREATE TABLE a( id NUMBER(3), name VARCHAR2(30), sex VARCHAR2(2));INSERT INTO a(ID, NAME, sex) VALUES(1, '小游子', '女');INSERT INTO a(ID, NAME, sex) VALUES(2, '小优子', '男'...

merge into using

在写数据同步的脚本时,常常会遇到这样的需求:
存在时 -> 更新,不存在时 -> 插入。

-- 源表 a
CREATE TABLE a
(
  id   NUMBER(3),
  name VARCHAR2(30),
  sex  VARCHAR2(2)
);

INSERT INTO a(ID, NAME, sex) VALUES(1, '小游子', '女');
INSERT INTO a(ID, NAME, sex) VALUES(2, '小优子', '男');
COMMIT;

-- 目标表 b, 空的
CREATE TABLE b AS SELECT * FROM a WHERE 1 = 2;

2 merge into 语句

merge 是 Oracle9i 新增的语法,根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入。
比单独的 update + insert的方式效率要更高,尤其是 on 条件下有唯一索引的时候,效率更高。

MERGE INTO 目标表 b
USING 源表 a
ON (b.字段1 = a.字段1 AND b.字段n = a.字段n) -- 必须带 ‘()’括号
WHEN MATCHED THEN -- 整体扫描,匹配时,执行此处
   UPDATE 子句
WHEN NOT MATCHED THEN -- 整体扫描,不匹配时,执行此处
   INSERT 子句;

实例: 将 源表 a 的数据同步至 b

MERGE INTO b
USING a
ON (b.id = a.id)
WHEN MATCHED THEN
   UPDATE SET b.name = a.name, b.sex = a.sex
WHEN NOT MATCHED THEN
   INSERT (b.id, b.name, b.sex) VALUES (a.id, a.name, a.sex);

本文地址:https://blog.csdn.net/u010074381/article/details/107392592