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 つのメッセージに関連付けられており、異なる日付の 2 つのグループにまとめられていますが、ID #43 は 1 つのメッセージにのみ関連付けられています。

UpdateTimeときどき、同じ ID を持つ各グループについて、グループ内の最大値よりも小さいすべてのメッセージ レコードを削除して、このテーブルをパージしたいと考えています。上記の例の最終結果は次のようになります。

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

ここで、上記のクエリによって返されたアイテムと一致するアイテムを削除する DELETE ステートメントを書きたいと思います。IDとの値に基づいてレコードを削除する必要がありUpdateTimeます。これを 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 に答える