如何将计算的行标记为已删除?继续上一个问题

时间:2009-10-19 19:45:05

标签: sql sql-server tsql

好的,我刚刚从上一个问题中意识到:Update main table based on rows from a secondary table

这是如何使用辅助表使用计数更新主表,但由于此查询将在sql作业中,如何删除我刚刚计算的行,并确保我不删除任何新的插入辅助表的行?

1 个答案:

答案 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)语句中。