数据库都是关于CRUD操作的。我们在各种数据库表中创建、读取、更新和删除数据。然而,数据库中的大多数CRUD操作需要单独的逻辑来完成任务,如插入、更新和删除。
这可能很快就会变得多余了。SQL Server提供了一种使用MERGE语句来执行CRUD操作的有效方法。微软在SQL Server 2008及以上版本中引入了合并语句。
本教程将了解如何使用SQL Server的合并语句在一个查询中执行多个操作。
基础知识
让我们举一个例子,你有两个表。目标表和源表。如果你需要根据源表的值来更新目标表的值,你可以采取三种途径。
- 第一种是源表在目标表中包含缺失的行。在这种情况下,你需要向目标表插入一个语句。
- 第二种情况是,目标表包含源表的缺失记录。这里,我们需要一个删除语句来从目标表中删除这些记录。
- 最后一种情况是,源表和目标表中的记录持有不同的值。在这种情况下,我们需要一个更新语句来更新目标表。
为了单独执行上述操作,我们需要为插入、删除和更新操作创建三个独立的逻辑。然而,我们可以使用合并语句将它们结合起来。
我们可以把合并语句的语法表达得如图所示。
MERGE target_table USING source_table
ON condition
WHEN matched
THEN update_operation
WHEN NOT matched -- by target table
THEN insert_operation
WHEN NOT matched BY SOURCE
THEN DELETE;
我们确定目标表和源表并在合并子句中指定它们。然后我们指定一个条件。指定的条件控制源表的行如何匹配到目标表。可以把它看作是一个连接条件。
下一个块包含了根据指定条件的结果所要执行的操作。
如果条件的结果是匹配,我们就从源表中更新目标表中的记录。
然而,如果记录不匹配(来自目标表),我们在目标表中插入缺少的记录。
最后,如果记录是不匹配的(由目标表),我们从目标表中删除不匹配的记录。
SQL Server - 合并示例
让我们举一个简单的例子。假设我们有两个包含产品信息的表,分别是products_target 和 product_source。
这个例子的代码片断显示了创建和更新指定表的SQL查询。
USE salesdb;
CREATE TABLE Products_target (
product_id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
product_name VARCHAR(255) NOT NULL,
price DECIMAL(10,2)
);
INSERT INTO Products_target(product_name, price)
VALUES ('Office Desk', 531),
('Office Chair', 379.99),
('Water Bottle', 69.99);
CREATE TABLE Products_source (
product_id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
product_name VARCHAR(255) NOT NULL,
price DECIMAL(10,2)
);
INSERT INTO Products_source(product_name, price)
VALUES ('Office Desk', 531.00),
('Desk Lamp', 50.00),
('Office Chair', 699.99),
('Water Bottle', 89.95);
现在我们有两个表作为目标和源执行。存储在表中的记录如图所示。

为了使目标表和源表之间的数据同步,我们可以执行一个合并查询,如下例所示。
MERGE Products_target AS t
USING Products_source AS s
ON (s.product_id = t.product_id)
WHEN matched
THEN UPDATE SET
t.product_name = s.product_name,
t.price = s.price
WHEN NOT matched BY target
THEN INSERT(product_name, price)
VALUES (s.product_name, s.price)
WHEN NOT matched BY SOURCE
THEN DELETE;
一旦我们执行上述查询,SQL服务器将根据结果条件执行指定的操作。
我们可以对合并操作后的表进行查询,如
SELECT * FROM Products_source;
SELECT * FROM Products_target;
结果的数值如下面的例子所示:

你会注意到,源表和目标表的记录与更新、插入和删除的值是同步的。
总结
本指南向你展示了如何使用SQL Server的合并语句。它允许你根据产生的条件对表进行插入、更新和删除操作。