【发布时间】:2018-06-19 15:35:17
【问题描述】:
我被要求将以下代码转换为 merge。以前一个月运行一次,现在应该每天运行一次……
在以下之前,EmailEvent 被截断:
DECLARE @upperLimit DATETIME = GETDATE();
DECLARE @lowerLimit DATETIME = DATEADD(day,-1,@upperLimit);
WHILE @upperLimit > '2013-01-31 10:03:09.000'
BEGIN
INSERT INTO EmailEvent
Select l.SalesForceID,
DENSE_RANK ( ) OVER (PARTITION BY es.email order by sentdate) as [EmailCount],
es.SentDate,
esd.eventtype,
esd.eventdate
FROM EmailSentDetails esd
join Silverpop_EmailSent es on esd.emailsent_id = es.EmailSent_ID
join Leads l on l.Email = es.Email
WHERE es.SentDate <= @upperLimit AND es.SentDate >= @lowerLimit
SET @upperLimit = @lowerLimit;
SET @lowerLimit = DATEADD(day,-1, @lowerLimit);
END
我知道 MERGE 无法完成,因为 EmailEvent 上没有键(无法唯一标识一行!)
我唯一能想到的是,不是截断/插入,而是添加以下内容,它会改善它吗?这是避免截断/插入的有效方法吗?
WHERE Not exists (select 1 from EmailEvent ev
where ev.salsforceId=l.SalesForceID
and ev.emailcount = DENSE_RANK ()OVER(PARTITION BY es.email order by sentdate)
and ev.sentDate=es.SentDate
and ev.EventDate=esd.EventDate)
【问题讨论】:
-
添加主键怎么样?
-
由于某种原因不能添加密钥吗?
-
我有点迷失为什么你甚至循环而不是更大的插入......看起来你可以创建一个子查询来获取你的数据,然后只做一个更大的插入,但我在这里可能非常错误......
-
即使我加了,源码也没有一键。
-
为什么那个时间在上限?为什么不只是白天。
标签: sql sql-server tsql merge