[英]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.