详解 SQL Merge关键字

Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。

MERGE的语法

MERGE INTO target_table

USING source_table

ON condition

WHEN MATCHED THEN

operation

WHEN NOT MATCHED THEN

operation;

注意:其中最后语句分号不可以省略,且源表既可以是一个表也可以是一个子查询语句。

MERGE的用法

merge无法多次更新同一行,也无法更新和删除同一行

当源表和目标表不匹配时:

若数据是源表有目标表没有,则进行插入操作;

若数据是源表没有而目标表有,则进行更新或者删除数据操作

当源表和目标表匹配时:

进行更新操作或者删除操作

MERGE的使用场景

数据同步

数据转换

基于源表对目标表做INSERT,UPDATE,DELETE操作

我们常用的是第三种场景

MERGE使用限制

在 MERGE MATCHED 操作中,只能允许执行 UPDATE 或者 DELETE 语句。

在 MERGE NOT MATCHED 操作中,只允许执行 INSERT 语句。

一个 MERGE语句中出现的MATCHED操作,只能出现一次 UPDATE 或者 DELETE 语句,否则就会出现下面的错误: An action of type ‘WHEN MATCHED’ cannot appear more than once in a ‘UPDATE’ clause of a MERGE statement.

MERGE示例

下面我们通过一个示例来介绍一下该如何使用MERGE,我们以Customers表和Orders表为例。数据如下:

SQL中Merge的用法SQL中Merge的用法
SQL中Merge的用法SQL中Merge的用法

Q:当Customers表里的客户有购买商品,我们就更新一下他们的下单时间,将他们的下单时间往后推迟一小时,如果客户没有购买商品,那么我们就将这些客户的信息插入到订单表里。

根据上面的要求我们可以这样写SQL:

MERGE INTO Orders O
--确定目标表Orders
USING Customers C ON C.客户ID=O.客户ID  
--从源表Customers确定关联条件 C.客户ID=O.客户ID
WHEN MATCHED  
--当匹配时对目标表的订单日期执行更新操作
THEN UPDATE SET O.订单日期=DATEADD(HOUR,1,O.订单日期)
WHEN NOT MATCHED BY TARGET
--当不匹配时对目标表进行插入操作
THEN INSERT (客户ID,员工ID,订单日期,发货ID)
VALUES (C.客户ID,NULL,NULL,NULL)

我们看一下Orders表里的结果:

SQL中Merge的用法SQL中Merge的用法

我们发现与Customers表里匹配上的订单日期被修改了,订单日期往后推迟了一小时,而没有匹配上的在订单表尾部增加了几行记录。这就是MERGE的实际应用了。

OUTPUT子句

MERGE还能与OUTPUT一起使用,可以将刚刚做过变动的数据进行输出,我们以上面的示例为基础,进行示范。

MERGE INTO Orders O
--确定目标表Orders
USING Customers C ON C.客户ID=O.客户ID
--从源表Customers确定关联条件 C.客户ID=O.客户ID
WHEN MATCHED  
--当匹配时对目标表的订单日期执行更新操作
THEN UPDATE SET O.订单日期=DATEADD(HOUR,1,O.订单日期)
WHEN NOT MATCHED BY TARGET
--当不匹配时对目标表进行插入操作
THEN INSERT (客户ID,员工ID,订单日期,发货ID)
VALUES (C.客户ID,NULL,NULL,NULL)
OUTPUT $action AS [ACTION],Inserted.订单日期 ,
Inserted.客户ID,Inserted.发货ID,Inserted.员工ID
--用OUTPUT输出刚刚变动过的数据

执行上述语句结果如下:

SQL中Merge的用法SQL中Merge的用法

从上图我们看到,执行的动作都是更新,这里的动作只有UPDATE和DELETE,插入也属于更新,此外我们看到订单日期又往后推迟了一小时,是因为我们又一次执行了往后增加一小时的更新操作,其他的字段没变。

总结

MERGE功能比较丰富,以上我们只是简单介绍了一些常用功能,还有其他一些用法,有兴趣的可以搜索一下并动手尝试。在我们要对表做多种操作时,这种写法不仅可以节省代码,而且有时候还可以提高执行效率。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/221813.html<

(0)
管理的头像管理
上一篇2025-04-15 05:12
下一篇 2025-04-15 05:13

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注