sql语句删除早于XXX的记录,只要有超过YY行

时间:2008-10-16 22:25:11

标签: sql datetime

假设一个表格包含以下列:

pri_iditem_idcommentdate

我想要的是一个SQL查询,它将删除任何比给定日期更早的特定item_id的记录,但只要有超过15行{{1 }}

这将用于清除项目超过1年的评论记录,但我仍希望在任何给定时间保留至少15条记录。这样,如果我有一个评论10年,它将永远不会被删除,但如果我在过去5天有100条评论,我只保留最新的15条记录。这些当然是本例的任意记录计数和日期时间范围。

我想找到一种非常通用的方法,可以在mysql,oracle,postgres等中使用。我正在使用phps adodb库进行数据库抽象,所以如果可能的话,我希望它可以很好地工作

3 个答案:

答案 0 :(得分:5)

这样的事情对你有用:

delete
from
  MyTable
where
  item_id in
  (
    select
      item_id
    from
      MyTable
    group by
      item_id
    having
      count(item_id) > 15
  )
  and
    Date < @tDate

答案 1 :(得分:2)

你想要保持至少15个,对吗?所以:

    DELETE
    FROM    CommentTable
    WHERE   CommentId NOT IN (
            SELECT  TOP 15 CommentId
            FROM    CommentTable
            WHERE   ItemId=@ItemId
            AND CommentDate < @Date
            ORDER BY CommentDate DESC
    )
    AND ItemId=@ItemId
    AND CommentDate < @Date

答案 2 :(得分:0)

这是你要找的吗?

DELETE
    [MyTable]
WHERE
    [item_id] = 100 and
    (SELECT COUNT(*) FROM [MyTable] WHERE [item_id] = 100) > 15

我是MS SQL Server的人,但我认为它应该适用于其他地方。