• SQL Server MERGE(合并)语句


    如何使用SQL Server MERGE语句基于与另一个表匹配的值来更新表中的数据。

     SQL Server MERGE语句

    假设有两个表,分别称为源表和目标表,并且需要根据与源表匹配的值来更新目标表。有以下三种情况:

    1. 源表中有一些目标表中不存在的行。在这种情况下,需要将源表中的行插入目标表中。
    2. 目标表中的某些行在源表中不存在。在这种情况下,需要从目标表中删除行。
    3. 源表中的某些行与目标表中的行具有相同的键。但是,这些行在非键列中具有不同的值。在这种情况下,需要使用源表中的值更新目标表中的行。

    下图说明了源表和目标表以及相应的操作:插入,更新和删除:

     

     如果使用INSERTUPDATE以及DELETE单独的语句,你必须建立三个单独的语句从源表匹配的行更新数据到目标表。

    但是,SQL Server提供了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;

    首先,在MERGE子句中指定目标表和源表。

    其次,merge_condition确定源表中的行与目标表中的行如何匹配。它类似于join子句中的join条件。通常,使用主键或唯一键的键列进行匹配。

    三,merge_condition结果有三种状态:MATCHEDNOT MATCHED,和NOT MATCHED BY SOURCE

    MATCHED:这些是符合合并条件的行。对于匹配的行,需要使用源表中的值更新目标表中的行列。

    NOT MATCHED:这些是源表中的行,目标表中没有任何匹配的行。在这种情况下,需要将源表中的行添加到目标表中。请注意,NOT MATCHED也称为NOT MATCHED BY TARGET。

    NO MATCHED BY SOURCE:这些是目标表中的行,与源表中的任何行都不匹配。如果要使目标表与源表中的数据同步,则需要使用此匹配条件从目标表中删除行。

    SQL Server MERGE语句示例

    假设我们有两个表,sales.category并且sales.category_staging按产品类别存储销售额。

    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,'自行车',15000),
        (2,'摩托车',25000),
        (3,'汽车',13000),
        (4,'火车',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,'自行车',15000),
        (3,'汽车',13000),
        (4,'火车',20000),
        (5,'飞机',10000),
        (6,'火箭',10000);

    要使用(源表)中sales.category的值将数据更新到(目标sales.category_staging表),使用以下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;

    SQL Server合并示例

    在此示例中,我们将category_id两个表中的列中的值用作合并条件。

    • 首先,sales.category_staging表中ID为1、3、4的行与目标表中的行匹配,因此,该MERGE语句更新了表中类别名称和数量列中的值sales.category。
    • 其次,sales.category_staging表中ID为5和6的行在表中不存在sales.category,因此该MERGE语句将这些行插入到目标表中。
    • 第三,sales.category表中ID为2的行在表中不存在sales.sales_staging,因此,该MERGE语句删除了该行。

    合并的结果是,sales.category表中的数据与sales.category_staging表中的数据完全同步  。

  • 相关阅读:
    Kafka原理与java simple producer示例
    【转载】kafka的工作原理
    Python 基本类型转换
    hadooop2.6 job pending research
    记一次zookeeper集群搭建错误的排除
    Apache Drill Install and Test
    Linux或Unix环境利用符号链接升级Maven
    Android之Linearlayouy线性布局
    Effective Java Second Edition --- Builder Pattern
    java生产者/消费者模式实现——一生产者一消费者(操作值)
  • 原文地址:https://www.cnblogs.com/yigegaozhongsheng/p/11941734.html
Copyright © 2020-2023  润新知