zoukankan      html  css  js  c++  java
  • sqlserver merge 操作符

    语法:

    MERGE

      [ INTO ] <target_table> [ [ AS ] table_alias ]

      USING <table_source> [ [ AS ] table_alias ]

      ON <merge_search_condition>

    [ WHEN MATCHED [ AND <clause_search_condition> ]

      THEN <merge_matched> ] [ ...n ]

    [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]

      THEN <merge_not_matched> ]

    [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]

      THEN <merge_matched> ] [ ...n ]

     

    先建立一张新表

    1 CREATE TABLE Sales.LastCustomerOrder
    2 (
    3   CustomerID INT,
    4   SalesOrderID INT,
    5   CONSTRAINT pk_LastCustomerOrder PRIMARY KEY CLUSTERED (CustomerId)
    6 ) ;

    下面检查一行数据,由于目标表没有改记录,那么直接插入改记录

     1 DECLARE @CustomerID INT = 100,
     2         @SalesOrderID INT = 101 ;
     3 
     4 MERGE INTO Sales.LastCustomerOrder AS tgt
     5     USING
     6         (SELECT @CustomerID AS CustomerID,
     7                 @SalesOrderID AS SalesOrderID
     8         ) AS src
     9     ON tgt.CustomerID = src.CustomerID
    10     WHEN MATCHED
    11         THEN UPDATE
    12             SET SalesOrderID = src.SalesOrderID
    13     WHEN NOT MATCHED
    14         THEN INSERT (
    15             CustomerID,
    16             SalesOrderID
    17             )
    18         VALUES (src.CustomerID,
    19                 src.SalesOrderID) ;

    结果

    再将下面测试数据带入merge 语句

     然后结果


    再建立一张表,多加一个字段 money ,用于存储订单最大钱数,如果后续来自 source 订单的钱数大于当前订单,更新数据,否则不更新,当然没有的数据要添加

    1 CREATE TABLE Sales.LargestCustomerOrder
    2 (
    3     CustomerID INT,
    4     SalesOrderID INT,
    5     TotalDue MONEY,
    6     CONSTRAINT pk_LargestCustomerOrder PRIMARY KEY CLUSTERED (CustomerId)
    7 );

    merge 语句

     1 DECLARE @CustomerID INT = 100,
     2         @SalesOrderID INT = 101 ,
     3         @TotalDue MONEY = 1000.00;
     4 MERGE INTO Sales.LargestCustomerOrder AS tgt
     5 USING
     6     (SELECT @CustomerID AS CustomerID,
     7     @SalesOrderID AS SalesOrderID,
     8     @TotalDue AS TotalDue
     9     ) AS src
    10 ON tgt.CustomerID = src.CustomerID
    11     WHEN MATCHED AND tgt.TotalDue < src.TotalDue
    12         THEN UPDATE
    13             SET SalesOrderID = src.SalesOrderID
    14             , TotalDue = src.TotalDue
    15     WHEN NOT MATCHED
    16         THEN INSERT (
    17             CustomerID,
    18             SalesOrderID,
    19             TotalDue
    20             )
    21             VALUES (src.CustomerID,
    22             src.SalesOrderID,
    23             src.TotalDue);

    选择 matched 的顺序很重要,下面的情况会执行第一个为true 的分支

    1 WHEN MATCHED AND tgt.TotalDue < src.TotalDue
    2     THEN UPDATE
    3       SET SalesOrderID = src.SalesOrderID
    4       , TotalDue = src.TotalDue
    5 WHEN MATCHED
    6     THEN UPDATE
    7     SET SalesOrderID = src.SalesOrderID

    针对每一条记录操作的详细信息,下面的语句将会显示 执行的操作的统计信息

     1 DECLARE @CustomerID INT = 100,
     2         @SalesOrderID INT = 201 ,
     3         @TotalDue MONEY = 1200.00;
     4 MERGE INTO Sales.LargestCustomerOrder AS tgt
     5 USING
     6         (SELECT @CustomerID AS CustomerID,
     7         @SalesOrderID AS SalesOrderID,
     8         @TotalDue AS TotalDue
     9         ) AS src
    10 ON tgt.CustomerID = src.CustomerID
    11     WHEN MATCHED AND tgt.TotalDue < src.TotalDue
    12         THEN UPDATE
    13             SET SalesOrderID = src.SalesOrderID
    14             , TotalDue = src.TotalDue
    15     WHEN NOT MATCHED
    16         THEN INSERT (
    17         CustomerID,
    18         SalesOrderID,
    19         TotalDue
    20         )
    21         VALUES (src.CustomerID,
    22         src.SalesOrderID,
    23         src.TotalDue)
    24 
    25     OUTPUT
    26     $ACTION,
    27     DELETED.*,
    28     INSERTED.*;

    结果

  • 相关阅读:
    python之类的详解
    flask中cookie和session介绍
    Flask数据库的基本操作
    CSRF原理
    Ajax.2
    浅谈Ajax
    Django中的缓存机制
    Django简介
    HTTP协议
    web应用
  • 原文地址:https://www.cnblogs.com/Spinoza/p/15471431.html
Copyright © 2011-2022 走看看