1. 用法
根据与源表联接的结果,对目标表运行插入、更新或删除操作。
例如,根据与另一个表的区别,在一个表中插入、更新或删除行,从而同步两个表。
2. 语法
MERGE target_table AS target
USING source_table AS source
ON (merge_condition)
WHEN MATCHED THEN
... (update statement)
WHEN NOT MATCHED THEN
... (insert statement)
WHEN NOT MATCHED BY SOURCE THEN
... (delete statement)
-
target_table 是目标表,它是我们要进行插入、更新和删除操作的表。
-
source_table 是源表,它是我们用于与目标表进行匹配的源数据集。
-
merge_condition 是用于匹配目标表和源表的条件,通常是两个表之间的某个列或一组列的比较。
-
WHEN MATCHED THEN 子句定义了当目标表和源表匹配时要执行的更新操作。
-
WHEN NOT MATCHED THEN 子句定义了当目标表和源表不匹配时要执行的插入操作。
-
WHEN NOT MATCHED BY SOURCE THEN 子句定义了当目标表中的记录在源表中找不到匹配时要执行的删除操作。
3. 应用示例
源表:MERGE_SOURCE:
要更新的目标表:MERGE_TARGET
代码实现:
--建表
if object_id('MERGE_SOURCE','u') is not null drop table MERGE_SOURCE
go
create table MERGE_SOURCE(
ID INT
,Name varchar(20)
,age int
)
go
insert into MERGE_SOURCE
values
(1,'Amy',23)
,(2,'Coco',26)
,(3,'Helen',30)
go
if object_id('MERGE_TARGET','u') is not null drop table MERGE_TARGET
go
create table MERGE_TARGET(
ID INT
,Name varchar(20)
,age int
)
go
insert into MERGE_TARGET
values
(1,'Amy',23)
,(3,'Helen',30)
,(4,'Emma',25)
,(5,'Jane',21)
go
--操作
merge into MERGE_TARGET TARGET--要更新的目标表
USING(SELECT B.ID,B.NAME,B.AGE FROM MERGE_SOURCE B) SOURCE--源表
ON(TARGET.ID=SOURCE.ID)
WHEN MATCHED THEN
UPDATE
SET TARGET.NAME=SOURCE.NAME,
TARGET.AGE=SOURCE.AGE
WHEN NOT MATCHED THEN
INSERT VALUES(SOURCE.ID,SOURCE.NAME,SOURCE.AGE);
运行成功之后TARGET表显示: