sql-server – 在MS SQL触发器中处理多个记录
发布时间:2021-01-19 10:03:14 所属栏目:MsSql教程 来源:网络整理
导读:我不得不第一次在MSSQL中使用触发器,一般来说是很好的触发器.阅读并自己测试后,我现在意识到触发器会触发每个命令,而不是每行插入,删除或更新. 整个事情是广告系统的一些统计数据.我们的主要统计表相当大,并且在大多数情况下不包含有意义的数据.它包含每个广
在帮助之后,这是我的最终结果,以防其他人有类似的问题 CREATE TRIGGER [dbo].[TR_STAT_INSERT] ON [iqdev].[dbo].[Stat] AFTER INSERT AS BEGIN SET NOCOUNT ON -- insert all missing "CachedStats" rows INSERT INTO CachedStats ([Date],AdvertId,CampaignName) SELECT DISTINCT CONVERT(Date,i.[Date]),i.AdvertId,i.[PublisherCustomerId],c.Id,c.Name FROM Inserted i INNER JOIN Advert AS a ON a.Id = i.AdvertId INNER JOIN Campaign AS c ON c.Id = a.CampaignId WHERE i.[Approved] = 1 AND NOT EXISTS ( SELECT 1 FROM CachedStats as t WHERE [Date] = CONVERT(Date,i.[Date]) AND CampaignId = c.Id AND CustomerId = i.[PublisherCustomerId] AND t.AdvertId = i.AdvertId ) -- update all affected records at once UPDATE CachedStats SET Clicks = Clicks + ( SELECT COUNT(*) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,s.[Date]) = CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] = 0 ),UniqueClicks = UniqueClicks + ( SELECT COUNT(*) FROM Inserted s WHERE s.Approved = 1 AND s.[Unique] = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,[Views] = [Views] + ( SELECT COUNT(*) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] = 2 ),UniqueViews = UniqueViews + ( SELECT COUNT(*) FROM Inserted s WHERE s.Approved = 1 AND s.[Unique] = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,Leads = Leads + ( SELECT COUNT(*) FROM Inserted s WHERE s.Approved = 1 AND s.[Unique] = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] IN (1,3,4) ),PublisherEarning = CachedStats.PublisherEarning + ISNULL(( SELECT SUM(PublisherEarning) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId ),0),AdvertiserCost = CachedStats.AdvertiserCost + ISNULL(( SELECT SUM(AdvertiserCost) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId ),PublisherOrderValue = PublisherOrderValue + ISNULL(( SELECT SUM(PublisherEarning) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] = 3 ),AdvertiserOrderValue = AdvertiserOrderValue + ISNULL(( SELECT SUM(AdvertiserCost) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] = 3 ),PublisherCPC = CASE WHEN (Clicks + ( SELECT COUNT(*) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] = 0 )) > 0 THEN (CachedStats.PublisherEarning + ISNULL(( SELECT SUM(PublisherEarning) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId ),0)) -- COST ^ / ( Clicks + ( SELECT COUNT(*) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] = 0 ) ) --- Clicks ^ ELSE 0 END,AdvertiserCPC = CASE WHEN (Clicks + ( SELECT COUNT(*) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] = 0 )) > 0 THEN (CachedStats.AdvertiserCost + ISNULL(( SELECT SUM(AdvertiserCost) FROM Inserted s WHERE s.Approved = 1 AND s.PublisherCustomerId = i.PublisherCustomerId AND CONVERT(Date,i.[Date]) AND s.AdvertId = i.AdvertId AND s.[Type] = 0 ) ) --- Clicks ^ ELSE 0 END FROM Inserted i WHERE i.Approved = 1 AND CachedStats.Advertid = i.AdvertId AND CachedStats.[Date] = Convert(Date,i.[Date]) AND CachedStats.CustomerId = i.PublisherCustomerId SET NOCOUNT OFF END 它现在看起来略有不同,因为我也必须为每个广告编制索引 – 但非常感谢帮助 – 从30小时到30秒加速所有内容从我自己的开发Stat表生成CachedStats (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |