如何使用SQL Server的合并语句

300 阅读3分钟

数据库都是关于CRUD操作的。我们在各种数据库表中创建、读取、更新和删除数据。然而,数据库中的大多数CRUD操作需要单独的逻辑来完成任务,如插入、更新和删除。

这可能很快就会变得多余了。SQL Server提供了一种使用MERGE语句来执行CRUD操作的有效方法。微软在SQL Server 2008及以上版本中引入了合并语句。

本教程将了解如何使用SQL Server的合并语句在一个查询中执行多个操作。

基础知识

让我们举一个例子,你有两个表。目标表和源表。如果你需要根据源表的值来更新目标表的值,你可以采取三种途径。

  1. 第一种是源表在目标表中包含缺失的行。在这种情况下,你需要向目标表插入一个语句。
  2. 第二种情况是,目标表包含源表的缺失记录。这里,我们需要一个删除语句来从目标表中删除这些记录。
  3. 最后一种情况是,源表和目标表中的记录持有不同的值。在这种情况下,我们需要一个更新语句来更新目标表。

为了单独执行上述操作,我们需要为插入、删除和更新操作创建三个独立的逻辑。然而,我们可以使用合并语句将它们结合起来。

我们可以把合并语句的语法表达得如图所示。

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的合并语句。它允许你根据产生的条件对表进行插入、更新和删除操作。