匹配不起作用时的T-SQL合并

时间:2017-01-12 14:55:43

标签: sql sql-server tsql merge

我有一个临时表,其中包含域之间的电子邮件流量数据,如下所示:

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

那是:

  • 电子邮件ID 500从abc.com发送到pqr.com(1个发件人,1个收件人)
  • 电子邮件ID 501从def.com发送到stu.com和pqr.com(1个发件人,2个收件人)
  • 电子邮件ID 502从abc.com发送到pqr.com(1个发件人,1个收件人)

我正在尝试编制一份报告,其中包含域名之间发送的电子邮件总数,以生成以下内容:

[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)

有人能够发现我做错了吗?

提前致谢

2 个答案:

答案 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