簡體   English   中英

SQL合並僅插入行,而不是更新

[英]SQL Merge only inserting rows, not updating

在SQL Server 2016中,我正在嘗試使用Merge在目標表中創建/更新記錄,但我認為我遇到了一個限制,其中Merge只進行一次數據傳遞,所以我得到所有插入而沒有更新。

在目標表中(在合並開始時為空),每天只應有一個記錄/ sitename / username,但它每天創建多個。 我想做的是:

“遍歷源表的每一行;如果目標表中不存在當天的行/ sitename / username,則插入新記錄;如果目標表中存在當天的行/ sitename / username DOES,請更新它通過添加到BytesTransferred並遞增Connections(但如果源表中有多個相同的transactionID,則只為該transactionID增加一次Connections)。“

這是創建的目標表:

CREATE TABLE tbl_Report_Active_Users(
    ID [int] IDENTITY(1,1) NOT NULL,
    DayOfRecord [date] NULL,
    SiteName [nvarchar](50) NULL,
    UserName [nvarchar](50) NULL,
    Connections [bigint] NULL,
    BytesTransferred [numeric](18, 0) NULL,
CONSTRAINT [PK_tbl_Report_User_Activity] PRIMARY KEY CLUSTERED 
)
CREATE NONCLUSTERED INDEX IX_tbl_Report_Active_Users_dayofrecord_sitename_username ON
 tbl_Report_Active_Users (DayOfRecord,SiteName,UserName)

這是我正在嘗試的合並代碼:

MERGE INTO tbl_Report_Active_Users AS target
USING (SELECT p.ProtocolCommandID, p.TransactionID, p.BytesTransferred,
 CONVERT(date,p.Time_stamp) As DayOfRecord, p.SiteName, p.UserName
        FROM tbl_ProtocolCommands p) AS source
    (ProtocolCommandID, TransactionID, BytesTransferred, DayOfRecord, SiteName,
UserName)
ON (target.DayOfRecord = source.DayOfRecord AND target.SiteName = source.SiteName 
AND target.UserName = source.UserName)
WHEN MATCHED THEN
    UPDATE SET BytesTransferred = target.BytesTransferred + source.BytesTransferred,
        Connections = target.Connections + 
                CASE WHEN source.ProtocolCommandID = (SELECT MIN(p.ProtocolCommandID)
                FROM tbl_ProtocolCommands p 
                INNER JOIN tbl_Authentications a ON a.TransactionID = p.TransactionID
                WHERE p.TransactionID = source.TransactionID AND a.ResultID=0
                GROUP BY p.TransactionID
                ) THEN 1 ELSE 0 END
WHEN NOT MATCHED THEN
    INSERT (DayOfRecord,SiteName,UserName,Connections,BytesTransferred)
    VALUES (source.DayOfRecord,source.SiteName,source.UserName,1,
source.BytesTransferred);

我在目標表中得到這樣的記錄:

ID  DayOfRecord SiteName    UserName    Connections BytesTransferred    (TransactionID)
1   2018-06-27  sales1  Jenkins 1   1829    333
2   2018-06-27  sales1  Jenkins 1   1829    333
3   2018-06-27  sales1  Jenkins 1   500     333
4   2018-06-27  sales1  Smith   1   500     376
5   2018-06-27  sales1  Smith   1   20559   391

但是會期待這個:

1   2018-06-27  sales1  Jenkins 1   4158
2   2018-06-27  sales1  Smith   2   21059

有關如何最好地完成這一點的任何想法?

我認為你因為加入“tbl_authentications”表而面臨這個問題。 你的其余合並聲明工作正常,

    MERGE INTO tbl_report_active_users AS target 
using (SELECT p.protocolcommandid, 
              p.transactionid, 
              p.bytestransferred, 
              CONVERT(DATE, p.time_stamp) AS DayOfRecord, 
              p.sitename, 
              p.username 
       FROM   tbl_protocolcommands p) AS source
        (protocolcommandid, 
       transactionid, bytestransferred, dayofrecord, sitename, username) 

ON ( target.dayofrecord = source.dayofrecord 
     AND target.sitename = source.sitename 
     AND target.username = source.username ) 
WHEN matched THEN 
  UPDATE SET bytestransferred = target.bytestransferred 
                                + source.bytestransferred, 
             connections = target.connections + CASE WHEN 
                           source.protocolcommandid = (SELECT 
                           Min(p.protocolcommandid) FROM tbl_protocolcommands p 
                           --INNER JOIN 
                           --tbl_authentications a 
                           --ON a.transactionid = p.transactionid 
                            WHERE 
                           p.transactionid = 
                           source.transactionid 
                           --AND a.resultid=0
                            GROUP BY 
                           p.transactionid ) 
                           THEN 1 ELSE 0 END 
WHEN NOT matched THEN 
  INSERT (dayofrecord, 
          sitename, 
          username, 
          connections, 
          bytestransferred) 
  VALUES (source.dayofrecord, 
          source.sitename, 
          source.username, 
          1, 
          source.bytestransferred); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM