­

SQL Server merge用法

  • 2019 年 10 月 10 日
  • 筆記

有两个表名:source 表和 target 表,并且要根据 source 表中匹配的值更新 target 表。

有三种情况:

  • source 表有一些 target 表不存在的行。在这种情况下,需要将 source 表中的行插入到 target 中。
  • target 表有一些 source表不存在的行。这种情况下,需要从 target 表中删除行。
  • source 表的某些行具有与 target 表中的行相同的键。但是,这些行在非键列中具有不同的值。这种情况下,需要使用来自 source 表中的值更新 target 表中的行。

下图,说明了 source 表和 target 表 的一些操作:插入,更新,删除:

如果单独使用 INSERT, UPDATE和DELETE语句,则需要三个单独的语句,来使 source 表中的匹配行的数据更新到 target表。

但是,使用 merge 可以同时执行三个操作。下面是 merge语句的语法:

MERGE target_table USING source_table  ON merge_condition  WHEN MATCHED      THEN update_statement  WHEN NOT MATCHED      THEN insert_statement  WHEN NOT MATCHED BY SOURCE      THEN DELETE;

使用示例:

CREATE TABLE sales.category (      category_id INT PRIMARY KEY,      category_name VARCHAR(255) NOT NULL,      amount DECIMAL(10 , 2 )  );    INSERT INTO sales.category(category_id, category_name, amount)  VALUES(1,'Children Bicycles',15000),      (2,'Comfort Bicycles',25000),      (3,'Cruisers Bicycles',13000),      (4,'Cyclocross Bicycles',10000);      CREATE TABLE sales.category_staging (      category_id INT PRIMARY KEY,      category_name VARCHAR(255) NOT NULL,      amount DECIMAL(10 , 2 )  );      INSERT INTO sales.category_staging(category_id, category_name, amount)  VALUES(1,'Children Bicycles',15000),      (3,'Cruisers Bicycles',13000),      (4,'Cyclocross Bicycles',20000),      (5,'Electric Bikes',10000),      (6,'Mountain Bikes',10000);

要使用 sales.category_staging(源表)中的值将数据更新到 sales.category(目标表),要使用 merge:

MERGE sales.category t      USING sales.category_staging s  ON (s.category_id = t.category_id)  WHEN MATCHED      THEN UPDATE SET          t.category_name = s.category_name,          t.amount = s.amount  WHEN NOT MATCHED BY TARGET      THEN INSERT (category_id, category_name, amount)           VALUES (s.category_id, s.category_name, s.amount)  WHEN NOT MATCHED BY SOURCE      THEN DELETE;

执行过程如下图: