使用GROUP BY和聚合条件进行DELETE

时间:2017-05-23 13:58:32

标签: sql sql-server

我有一个包含外键和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
 )

但我想删除单个查询中的所有项目。我怎样才能做到这一点?

2 个答案:

答案 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
)