好的,我刚刚从上一个问题中意识到:Update main table based on rows from a secondary table
这是如何使用辅助表使用计数更新主表,但由于此查询将在sql作业中,如何删除我刚刚计算的行,并确保我不删除任何新的插入辅助表的行?
答案 0 :(得分:1)
如果我正确读取它,您希望(在第一个问题中)使用与每个EmployeeID关联的唯一IP数更新SelectionCount,现在在同一个过程中清除Selection表中的记录这些计数 - 同时没有触及自SelectionCount更新以来添加的任何记录。如果您的选择表具有1)主键,以及2)创建行的日期,则这将更容易。两者的缺失使事情变得复杂。
因此,我们将以一种略微奇怪的方式执行此操作(假设您无法更改架构)。假设您使用的是SQL 2005或2008:
我在猜这里的数据类型
DECLARE @TempIPs TABLE(EmployeeID int, ipaddress varchar(25))
DELETE FROM Selection
OUTPUT deleted.EmployeeID, deleted.ipAddress
INTO @TempIPs
- 使用包含旧版IP的@TempIPs替换对Selection表的引用。
UPDATE Employee
SET SelectionCount = IsNull((SELECT Count(DISTINCT ipAddress)
FROM @TempIPs
WHERE @TempIPs.EmployeeID = Employee.ID), 0)
如果您计划在添加新记录时继续增加SelectionCount,只需将+ SelectionCount添加到UPDATE语句即可。您还应该将整个批次包装在事务(BEGIN TRANSACTION .... COMMIT TRANSACTION)语句中。