java sql merge_SQL Server MERGE(合并)语句

本文介绍如何使用 SQLServer 的 MERGE 语句基于与另一个表匹配的值来更新表中的数据。通过示例演示了如何实现插入、更新和删除操作,使两个表的数据保持同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

SQL Server MERGE语句

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

源表中有一些目标表中不存在的行。在这种情况下,需要将源表中的行插入目标表中。

目标表中的某些行在源表中不存在。在这种情况下,需要从目标表中删除行。

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

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

e8314bf1b81cfcc1c7a3bb96962f01e0.png

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

但是,SQL Server提供了MERGE允许同时执行三个操作的语句。下面显示了该MERGE语句的语法:

MERGE target_table USING source_tableONmerge_conditionWHENMATCHEDTHENupdate_statementWHEN NOTMATCHEDTHENinsert_statementWHEN NOT MATCHED BYSOURCETHEN DELETE;

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

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

三,merge_condition结果有三种状态:MATCHED,NOT 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 TABLEsales.category (

category_idINT PRIMARY KEY,

category_nameVARCHAR(255) NOT NULL,

amountDECIMAL(10 , 2)

);INSERT INTOsales.category(category_id, category_name, amount)VALUES(1,'自行车',15000),

(2,'摩托车',25000),

(3,'汽车',13000),

(4,'火车',10000);CREATE TABLEsales.category_staging (

category_idINT PRIMARY KEY,

category_nameVARCHAR(255) NOT NULL,

amountDECIMAL(10 , 2)

);INSERT INTOsales.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 sON (s.category_id =t.category_id)WHENMATCHEDTHEN UPDATE SETt.category_name=s.category_name,

t.amount=s.amountWHEN NOT MATCHED BYTARGETTHEN INSERT(category_id, category_name, amount)VALUES(s.category_id, s.category_name, s.amount)WHEN NOT MATCHED BYSOURCETHEN 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语句删除了该行。

c43bcafa42405c99f7ca42a15d486152.png

12820a50f51c17e452e2520f0ec63d55.png

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

98bff869c8bb12e762cd706e075dcaaa.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值