4

我有一个具有以下架构的表:

ID NVARCHAR(10)
Message NVARCHAR(300)
UpdateTime DATETIME

其中 ID 是外键。新消息记录被添加到具有相同UpdateTime. 一个例子是(按ID和排序UpdateTime):

ID   | Status        | UpdateTime
---------------------------------
42     Cluster1-Msg1   2012-12-25
42     Cluster1-Msg2   2012-12-25
42     Cluster2-Msg1   2013-10-10
42     Cluster2-Msg2   2013-10-10
43     Cluster4-Msg1   2011-11-27

这里 ID #42 与 4 条消息相关联,在不同日期聚集在两组中,而 ID #43 仅与一条消息相关联。

有时我希望通过删除此表来清除此表,对于具有相同 ID 的每个组,删除UpdateTime小于组内最大值的所有消息记录。上面示例中的最终结果将是:

42     Cluster2-Msg1   2013-10-10
42     Cluster2-Msg2   2013-10-10
43     Cluster4-Msg1   2011-11-27

以下 SQL 查询查找我要删除的所有记录:

SELECT Msgs.ID, Msgs.UpdateTime
FROM Messages Msgs
JOIN
(SELECT ID, MAX(UpdateTime) AS MaxTime FROM Messages GROUP BY ID) MaxTimes
ON Msgs.ID = MaxDates.ID
WHERE Msgs.UpdateTime < MaxTimes.MaxTime

现在我想编写一个删除语句,删除与上面查询返回的项目匹配的项目。必须根据IDUpdateTime值删除记录。我只是不明白如何在 Transact-SQL 中表达这一点。

4

2 回答 2

4
DELETE Msgs 
FROM Messages Msgs
JOIN (SELECT ID, MAX(UpdateTime) AS MaxTime FROM Messages GROUP BY ID) MaxTimes
    ON Msgs.ID = MaxDates.ID
WHERE Msgs.UpdateTime < MaxTimes.MaxTime

请注意,我所做的只是复制您原来的 SELECT 语句,并将第一行代码从 更改SELECT ...DELETE Msgs. 您必须指定表名,因为查询的 FROM 部分中有多个表表达式。

于 2013-10-10T12:41:46.190 回答
1
DELETE  DUB
FROM    Messages AS DUB
WHERE   EXISTS (
            SELECT  SUB.ID
            FROM    Messages AS SUB
            WHERE   SUB.ID = DUB.ID
            GROUP BY SUB.ID
            HAVING MAX(SUB.UpdateTime) > DUB.UpdateTime
        )

我发现这种相关的子查询更具可读性。

于 2013-10-10T15:09:03.533 回答