我有一个包含外键和DATETIME时间戳的表。我想删除时间戳晚于最终时间戳日期开头的所有行,但是要分别删除每个项目。
逻辑上我想要这样的东西:
DELETE FROM Entries
WHERE StartTime > CONVERT(Date,MAX(StartTime))
GROUP BY ItemId;
但是我不能在DELETE中使用GROUP BY,也不能在WHERE条件中使用SUM()。
我可以使用像这样的子查询一次删除它们:
DELETE FROM Entries
WHERE ItemId=@Id
AND StartTime > (
SELECT CONVERT(Date,MAX(StartTime)) FROM Entries
WHERE ItemId=@Id
)
但我想删除单个查询中的所有项目。我怎样才能做到这一点?
答案 0 :(得分:2)
对于您的查询,您可以使用
DELETE FROM E
FROM Entries E JOIN (
SELECT ItemId, MAX(StartTime) st from Entries GROUP BY ItemId)E2
ON E.ItemId=E2.ItemId
WHERE E.StartTime > CONVERT(Date,E2.st)
答案 1 :(得分:2)
您可以将查询重写为不使用@Id
:
DELETE e
FROM Entries AS e
WHERE StartTime > (
SELECT CONVERT(Date,MAX(StartTime)) FROM Entries ee
WHERE ee.ItemId=e.Id
)