存在时更新 不存在时新增: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