oracle 中 merge into 用法解析

一、使用背景

    当需要对一个表根据不同条件分别进行 INSERT、UPDATE 以及 DELETE 操作时,可以使用 MERGE(融合,合并) 语句。MERGE 语句可以根据不同条件获取要插入、更新或删除到表中的数据行,然后从 1 个或多个数据源头对表进行更新或者向表中插入行。

二、MERGE 语句的语法

MERGE INTO 表名

USING 表名 / 视图 / 子查询 ON 连接条件

– 当匹配得上连接条件时

WHEN MATCHED THEN

更新、删除操作

– 当匹配不上连接条件时

WHEN NOT MATCHED THEN
1. 正常模式

MERGE INTO A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON (A.id=C.AID)

WHEN MATCHED THEN

UPDATE SET A.YEAR=C.YEAR

WHEN NOT MATCHED THEN

 INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR); 

commit;

2. 只 update 模式

merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)

 

WHEN MATCHED THEN

UPDATE SET A.YEAR=C.YEAR;

commit;

3. 只 insert 模式

merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)

WHEN NOT MATCHED THEN

insert(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);

commit;

4. 带 where 条件的 insert 和 update。

merge into A_MERGE A USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C

ON(A.id=C.AID)

 

when matched then

update SET A.name=C.name where C.city != ‘江西’

when not matched then

insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city=‘江西’;

commit;

5. 无条件的 insert。

merge into C_MERGE C USING (select B.AID,B.NAME,B.City from B_MERGE B) C ON (1=0)

when not matched then

insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);

commit;

6. 带 delete 的 update

   MERGE 提供了在执行数据操作时清除行的选项. 你能够在 WHEN MATCHED THEN UPDATE 子句中包含 DELETE 子句. 

DELETE 子句必须有一个 WHERE 条件来删除匹配某些条件的行. 匹配 DELETE WHERE 条件但不匹配 ON 条件的行不会被从表中删除.

但我觉得这个带 where 条件的 update 差不多,都是控制 update,完全可以用带 where 条件的 update 来实现。