LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

[点晴永久免费OA]SQL Server Merge语句

freeflydom
2023年7月15日 10:22 本文热度 731

SQL Server MERGE语句简介

假设有两个表名为:source表和target表,并且需要根据source表中匹配的值更新target表。 有三种情况:

  • source表有一些target表中不存在的行。在这种情况下,需要将source表中的行插入到target表中。

  • target表有一些source表中不存在的行。 在这种情况下,需要从target表中删除行。

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

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


如果单独使用insertupdatedelete语句,则必须构造三个单独的语句,以使用source表中的匹配行将数据更新到target表。

但是,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子句中指定source_table表和target_table表。

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

第三,merge_condition有三种状态:MATCHEDNOT MATCHEDNOT MATCHED BY SOURCE

  • MATCHED:这些是与合并条件匹配的行。 在图中,它们显示为蓝色。 对于匹配的行,需要使用source_table表中的值更新target_table表中的行列。

  • NOT MATCHED:这些是source_table表中的行,target_table表中没有任何匹配的行。 在图中,它们显示为橙色。 在这种情况下,需要将source_table表中的行添加到target_table表。 请注意,NOT MATCHED BY TARGET也称为目标不匹配。

  • NO MATCHED BY SOURCE:这些是target_table表中与source_table表中的任何行都不匹配的行。 它们在图中显示为绿色。 如果要将target_table表与source_table表中的数据同步,则需要使用此匹配条件从target_table表中删除行。

SQL Server MERGE语句示例

假设有两个表:sales.categorysales.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,'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;

执行过程如下图所示 


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

  • 首先,sales.category_staging表中id值为1,3,4的行与目标表中的行匹配,因此,MERGE语句更新sales.category表中类别名称和amount列中的值。

  • 其次,sales.category_staging表中id值为56的行在sales.category表中不存在,因此MERGE语句将这些行插入到目标表中。

  • 第三,sales.sales_staging表中不存在sales.category表中具有id值为2的行,因此,MERGE语句将删除此行。

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





该文章在 2023/7/15 10:22:51 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved