我有一个临时表,其中包含域之间的电子邮件流量数据,如下所示:
[EmailId|SendingDomainId|SendingDomainName|RecipientDomainId|RecipientDomainName]
[500|600|abc.com|700|pqr.com]
[501|601|def.com|701|stu.com]
[501|601|def.com|700|pqr.com]
[502|600|abc.com|700|pqr.com]
那是:
我正在尝试编制一份报告,其中包含域名之间发送的电子邮件总数,以生成以下内容:
[SendingDomainId|SendingDomainName|RecipientDomainId|RecipientDomainName|Total]
[600|abc.com|700|pqr.com|2]
[601|def.com|701|stu.com|1]
[601|def.com|700|pqr.com|1]
我正在尝试此MERGE
语句,但UPDATE
部分无效。我最终得到的最终表包含与源表相同的行。
MERGE #DomainsChord_TrafficData as T
USING #DomainsChord_DomainEmails AS S
ON (S.SendingDomainId = T.SendingDomainId AND
S.RecipientDomainId = T.RecipientDomainId)
WHEN MATCHED THEN UPDATE
SET T.TotalEmails = T.TotalEmails+1
WHEN NOT MATCHED BY TARGET THEN
INSERT (SendingDomainId, SendingDomainName, RecipientDomainId,
RecipientDomainName, TotalEmails)
VALUES (S.SendingDomainId, S.SendingDomainName,
S.RecipientDomainId, S.RecipientDomainName, 1);
表#DomainsChord_TrafficData是合并前的空临时表。合并后,它最终得到与源表相同的数据(#DomainsChord_DomainEmails)
有人能够发现我做错了吗?
提前致谢
答案 0 :(得分:1)
如果表之前是空的,那么执行更新没有匹配,它是一个NOT MATCHED,因此插入运行。
答案 1 :(得分:0)
在您的情况下,您不需要MERGE
。您需要一个带SELECT
子句的简单GROUP BY
,如下所示:
SELECT SendingDomainId, SendingDomainName, RecipientDomainId, RecipientDomainName
, COUNT(*) AS Total
FROM #DomainsChord_DomainEmails
GROUP BY SendingDomainId, SendingDomainName, RecipientDomainId, RecipientDomainName;
输出
SendingDomainId SendingDomainName RecipientDomainId RecipientDomainName Total
--------------- ----------------- ----------------- ------------------- -----------
600 abc.com 700 pqr.com 2
601 def.com 700 pqr.com 1
601 def.com 701 stu.com 1
MERGE
语句用于将来自两个源的数据合并到目标中。如果您的目标(#DomainsChord_TrafficData)为空,则来自源(#DomainsChord_DomainEmails)的所有数据都会在您描述的目标中结束。
参考:MSDN MERGE T-SQL