Ø  简介

在平常编写增删改的 SQL 语句时,我们用的最多的就是 INSERT、UPDATE 和 DELETE 语句,这是最基本的增删改语句。其实,SQL Server 中还有另外一个可以实现增删改的语句,那就是本文将要介绍的 MERGE 语句。

1.   什么是 MERGE 语句

1)   MERGE 语句可以在一条语句中,根据与源表联接的结果,对目标表执行插入、更新或删除操作。 例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。

2)   为什么使用 MERGE 语句呢?

1.   试想一下,如果我们想要完成这件事情:将查询的结果集写入 A 表中,如果 A 表已经存在了该记录,就执行 UPDATE 语句(更新);否则,执行 INSERT 语句(新增)。(删除也是如此)

2.   如果按照我们的思路,是不是首先应该查出数据,在根据关键字段去 A 表中匹配,如果匹配到则执行 UPDATE 语句,否则执行 INSERT 语句。但是这样一来我们必须执行两次查询结果集:第一次查询比对,第二次查询后执行新增或更新操作,这样就相当繁琐也影响性能。

3.   而 MERGE 语句可以很轻松的帮我们解决这个问题,帮我们简洁了代码和优化性能。

2.   我的示例

1)   使用 MERGE语句完成新增或更新操作

INSERT INTO Sys_DbLog(LogTime, Type, Itme, Message, Remark) VALUES(GETDATE(), 'info', 'SP_Update_AchievCommission', '存储过程执行', NULL);

BEGIN TRY

WITH ce1(OrderNum, TotalMoney) AS

(

SELECT OrderNum, SUM(T2.TotalMoney) AS TotalMoney FROM Orders AS T1

INNER JOIN OrderDetail AS T2 ON(T1.Id = T2.OrderId)

WHERE 1=1

AND (T1.OrderStatusId > 1 AND T1.OrderStatusId < 10)

AND (T1.PayStatusId = 2 AND T1.PayTime >= @StartTime AND T1.PayTime <= @EndTime)

GROUP BY T1.OrderNum

)   --订单明细的总实付金额

MERGE INTO Crm_AchievCommission AS T1

USING

(

SELECT T1.OrderNum, T1.PayTime, T1.CityId AS OrderCityId, T3.CityId AS CustCityId, T4.CityId AS EmplCityId, T4.EmployeeId, T5.ProductId,

CAST(ROUND((T1.RealTotal - ISNULL(T1.Freight, 0)) * (ISNULL(T5.TotalMoney, 0) / T7.TotalMoney), 2) AS numeric(19,2)) AS RealTotal/*四舍五入保留两位小数*/,

T6.CommissionRate, T6.ExtraCommissionRate FROM Orders AS T1

INNER JOIN UserInfo AS T2 ON(T1.UserId = T2.Id)

INNER JOIN Customer AS T3 ON(T2.CustomerId = T3.Id)

INNER JOIN Sys_EmployeeProfile AS T4 ON(T1.SalesUserId = T4.EmployeeId)

INNER JOIN OrderDetail AS T5 ON(T1.Id = T5.OrderId)

INNER JOIN Crm_CommissionRates AS T6 ON(T5.ProductId = T6.ProductId)

INNER JOIN ce1 AS T7 ON(T1.OrderNum = T7.OrderNum)

WHERE 1=1

AND T1.UserId > 0

AND T2.CustomerId > 0

AND T1.SalesUserId > 0

AND (T1.OrderStatusId > 1 AND T1.OrderStatusId < 10)

AND (T1.PayStatusId = 2 AND T1.PayTime >= @StartTime AND T1.PayTime <= @EndTime)

) AS T2 ON(T1.OrderNum = T2.OrderNum AND T1.ProductId = T2.ProductId)

WHEN MATCHED

THEN UPDATE SET

OrderCityId = T2.OrderCityId,

CustCityId = T2.CustCityId,

EmplCityId = T2.EmplCityId,

EmployeeId = T2.EmployeeId,

RealTotal = T2.RealTotal,

UpdateTime = GETDATE()

WHEN NOT MATCHED

THEN INSERT(OrderNum, PayTime, OrderCityId, CustCityId, EmplCityId, EmployeeId, ProductId, RealTotal, CommissionRate, ExtraCommissionRate, CreateTime, UpdateTime)

VALUES(T2.OrderNum, T2.PayTime, T2.OrderCityId, T2.CustCityId, T2.EmplCityId, T2.EmployeeId, T2.ProductId, T2.RealTotal, T2.CommissionRate, T2.ExtraCommissionRate, GETDATE(), NULL);

END TRY

BEGIN CATCH

DECLARE @Message nvarchar(4000) = '错误行号:' + CAST(ERROR_LINE() AS nvarchar(20)) + ',错误信息:' + ERROR_MESSAGE();

INSERT INTO Sys_DbLog(LogTime, Type, Itme, Message, Remark) VALUES(GETDATE(), 'error', 'SP_Update_AchievCommission', @Message, NULL);

END CATCH

3.   更多介绍

1)   官网介绍

https://docs.microsoft.com/zh-cn/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

2)   其他

https://www.cnblogs.com/billqian/p/5157052.html

使用 MERGE 语句实现增删改的更多相关文章

  1. 四种简单的sql语句(增删改查语句)

    四种简单的sql语句(增删改查语句) 一.插入语句 insert into [table] ([column],[column],[column]) values(?,?,?) 二.删除语句 dele ...

  2. dml语句就是你常写的sql语句,增删改查

    dml语句就是你常写的sql语句,增删改查

  3. 利用sql语句进行增删改查

    1.查询 函数:raw(sql语句) 语法:Entry.objects.raw(sql) 返回:QuerySet 2.增删改 from django.db import connection def ...

  4. 常见 SQL语句使用 增删改查

    一.常见的增删改查(一).查:1.SELECT 列名称 FROM 表名称,其中列名可以是多个,中间用豆号分开,如SELECT LastName,FirstName FROM Persons: 2.SE ...

  5. SQL简单语句(增删改查)

    简单的SQL语句增删改查操作 说明: 在mysql里面亲测结果正确    用到的表(学生表:studnets) 1.创建一个学生表,(学号,姓名,性别,家庭住址) mysql> create t ...

  6. SQL语句简单增删改查

    常用数据类型 Int:整数,长度没有作用 Varchar:字符串,varchar(3)表示最多存放3个字符,1个中文或英文或符合都占1个字符 Decimal:小数,decimal(5,2)表示共存5位 ...

  7. SQL SQL语句的增删改查

    一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...

  8. SQL语句的增删改查

    一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...

  9. SQL语句的增删改查(详细)--转载

    转载源: http://blog.csdn.net/a88055517/article/details/6736284/ 一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [ ...

随机推荐

  1. 2017 百度杯丶春秋欢乐赛 writeup

    1. 内涵图(Misc) 题目: 我不是一个简单的图片 我是一个有内涵的图片 解:保存到桌面,右键属性->详细信息,即可获得flag. 2. 小电影(Misc) 题目: 我说过 这次比赛是让大家 ...

  2. JS第一部分--ECMAScript5.0标准语法 (JS基础语法)

    一,调试语句 二,JS的引入方式 三,变量的使用 四,基本的数据类型 4.1,基本数据类型转换 4.2,字符串的常用方法 五,复杂数据类型 5.1,Array(数组)及常用方法 六,流程控制( 逻辑与 ...

  3. 堡垒机paramiko模块

    paramiko简介: 模拟ssh客户端,使用ssh协议,基于sftp协议等做批量管理.例如处理用ssh登陆一千台机器执行同一个命令,或下载上传文件等需求 基于用户名密码登录执行命令: import ...

  4. HBase工具:如何查看HBase的HFile

    root@root:~/Desktop/sourceCodes/hbase-2.1.1/bin# ./hbase Usage: hbase [<options>] <command& ...

  5. kernel笔记——内核同步与锁

    内核同步 内核同步解决并发带来的问题,多个线程对同一数据进行修改,数据会出现不一致的情况,同步用于保护共享数据等资源. 有两种形式的并发: 同时进行式并发,在不同cpu上执行的进程同时访问共享数据 二 ...

  6. excel poi导出demo

    最近做了一个excel 导出的demo,是抄写老大的(嘻嘻嘻),现在把demo源码放在这里 链接:https://pan.baidu.com/s/1_xj0hej-1xwX5JF39acEOg 提取码 ...

  7. day 9~11 函数

    今日内容 '''函数四个组成部分函数名:保存的是函数的地址,是调用函数的依据函数体:就是执行特定功能的代码块函数返回值:代码块执行的结果反馈函数参数:完成功能需要的条件信息​1.函数的概念2.函数的定 ...

  8. zabbix 主动模式和被动模式说名

    一.zabbix agent主动模式与被动模式的区别 zabbix agent的运行模式有以下两种:1.被动模式:此模式为zabbix默认的工作模式,由zabbix server 向zabbix ag ...

  9. [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  10. 使用github 的相关博客

    基于hexo+github搭建一个独立博客     如何用Github的gh-pages分支展示自己的项目     使用git clone error: RPC failed     Git的使用-- ...