Ø  简介

在平常编写增删改的 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. 英语口语练习系列-C09-常用动词

    <先秦 · 关雎> 关关雎鸠,在河之洲.窈窕淑女,君子好逑. 参差荇菜,左右流之.窈窕淑女,寤寐求之. 求之不得,寤寐思服.悠哉悠哉,辗转反侧. 参差荇菜,左右采之.窈窕淑女,琴瑟友之. ...

  2. C#基础知识之Dictionary

    最近使用了Dictionary,出现了意想不到的错误,先记录一下自己遇到的问题以及目前我的解决方法,然后温习一下Dictionary的基础用法. 一.自己遇到的问题 1.代码如下: namespace ...

  3. 第一本Docker书读书笔记

    日常使用命令 1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: ...

  4. docker 常用命令和常用容器启动

    docker:systemctl start docker # docker 启动systemctl stop docker # docker 停止systemctl restart docker # ...

  5. Jenkins + Ansible + Gitlab之ansible篇

    Ansible介绍 什么是Ansible? Ansible是一个开源部署工具 开发语言:Python 特点:SSH协议通信,全平台,无需要编译,模块化部署管理 作用:推送Playbook进行远程节点快 ...

  6. vuex的使用步骤

    第一步: 安装vuex:npm install vuex --save 第二步:在src下创建文件夹store及文件index.js import Vue from 'vue'; import Vue ...

  7. Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

    前言 这篇博文本来是想放在全系列的大概第五.六篇的时候再讲的,毕竟查询是在索引创建.索引文档数据生成和一些基本概念介绍完之后才需要的.当前面的一些知识概念全都讲解完之后再讲解查询是最好的,但是最近公司 ...

  8. Pandas基本操作

    pandas:数据分析 pandas是一个强大的Python数据分析的工具包. pandas是基于NumPy构建的. pandas的主要功能 具备对其功能的数据结构DataFrame.Series 集 ...

  9. 1 vmware 如何联网,以及行命令令初步

    VMware安装Linux(我安装的是ubuntu),没法上网,上网教程见:https://blog.csdn.net/qq_28090573/article/details/78730552 安装完 ...

  10. Django rest framework 源码分析 (1)----认证

    一.基础 django 2.0官方文档 https://docs.djangoproject.com/en/2.0/ 安装 pip3 install djangorestframework 假如我们想 ...