当前位置: 首页 > 科技观察

谈谈Merge在SQL中的用法

时间:2023-03-23 01:29:41 科技观察

本文转载自微信公众号《SQL数据库开发》,作者,平凡的世界。转载本文请联系SQL数据库开发公众号。MERGE的定义MERGE关键字是一个神奇的DML关键字,可以将INSERT、UPDATE、DELETE等操作组合成一句话,根据与源表的join结果对目标表进行插入、更新或删除操作.MERGE语法MERGEINTOtarget_tableUSINGsource_tableONconditionWHENMATCHEDTHENoperationWHENNOTMATCHEDTHENoperation;注意:最后一条语句中的分号不能省略,源表可以是表也可以是子查询语句。MERGE的用法合并不能多次更新同一行,也不能同时更新和删除同一行。当源表和目标表不匹配时:如果数据在源表中,而目标表中没有,则执行插入操作;如果数据在源表中但不在目标表中如果有表,则更新或删除数据。当源表与目标表匹配时:更新或删除MERGE数据同步的使用场景。数据转换是基于源表对目标表进行INSERT、UPDATE、DELETE操作。在第三种情况下,MERGE的使用仅限于MERGEMATCHED操作,并且只允许UPDATE或DELETE语句。在MERGENOTMATCHED操作中,只允许使用INSERT语句。MERGE语句中出现的MATCHED操作在UPDATE或DELETE语句中只能出现一次,否则会出现如下错误:Anactionoftype'WHENMATCHED'cannotappearmorethanonceina'UPDATEclauseofaMERGEstatement.MERGEExample让我们用一个例子来介绍如何使用MERGE。我们以Customers表和Orders表为例。数据如下:CustomersOrdersQ:当Customers表中的客户购买了商品,我们会更新他们的下单时间,将他们的下单时间推迟一小时。信息被插入到订单表中。根据以上需求,我们可以这样写SQL:MERGEINTOOOrdersO--确定目标表OrdersUSINGCustomersCONC。客户ID=O。CustomerID--从源表CustomersC中判断关联条件,CustomerID=O。CustomerIDWHENMATCHED--匹配目标表的订单日期时执行更新操作THENUPDATESETO。Orderdate=DATEADD(HOUR,1,O.orderdate)WHENNOTMATCHEDBYTARGET--没有匹配时插入目标表THENINSERT(customerID,employeeID,orderdate,deliveryID)VALUES(C.CustomerID,NULL,NULL,无效的);(提示:代码可以左右滑动)我们看Orders表的结果:我们发现匹配Customers表的订单日期被修改了,订单日期变成了延迟一个小时后,几行在没有匹配的情况下被添加到订单表的末尾。这就是MERGE的实际应用。OUTPUT子句MERGE也可以和OUTPUT一起使用,输出刚刚改变的数据。下面我们根据上面的例子进行演示。MERGEINTOOOrdersO--确定目标表OrdersUSINGCustomersCONC.CustomerID=O.CustomerID--从源表Customers中确定关联条件C.CustomerID=O.CustomerIDWHENMATCHED--匹配时,对订单日期进行更新操作目标表THENUPDATESETO.OrderDate=DATEADD(HOUR,1,O.orderdate)WHENNOTMATCHEDBYTARGET--没有匹配时插入到目标表THENINSERT(customerID,employeeID,orderdate,deliveryID)VALUES(C.客户ID,NULL,NULL,NULL)OUTPUT$actionAS[ACTION],已插入。订单日期,已插入。客户ID,已插入。装运ID,已插入。EmployeeID--使用OUTPUT输出刚刚更改的数据;执行上面语句的结果如下:从上图中我们可以看到,执行的动作都是更新。这里的动作只有UPDATE和DELETE。插入也是更新。此外,我们看到订单日期已经推迟了一个小时,因为我们再次执行了它。小时更新操作,其他字段不变。综上所述,MERGE的功能非常多。上面我们只是简单介绍了一些常用的函数,还有其他的用法。有兴趣的可以搜索试试。当我们要对表进行多项操作时,这种写法不仅可以节省代码,有时还可以提高执行效率。

最新推荐
猜你喜欢