我有一个具有以下架构的表:
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
现在我想编写一个删除语句,删除与上面查询返回的项目匹配的项目。必须根据ID
和UpdateTime
值删除记录。我只是不明白如何在 Transact-SQL 中表达这一点。