我在博客上有一张写着评论的人的桌子。我需要留下表中每一个人的最后10条评论,并删除旧的评论。让我们说这些列是:
我知道如何使用多个查询,但不只是一个查询(允许任何子查询)和anyDatabase
通过以下方式:
select personId from PeopleComments
group by personId
having count(*) >10
我会得到超过10个评论的个人I,但我不知道如何从那里获得注释I并删除它们。
谢谢!
发布于 2020-02-29 14:21:46
在我的另一个答案中,DBMS必须为表中的每一行查找和计数行。这会很慢。最好找到我们希望保留的所有行,然后删除其他行。因此,这个额外的答案。
以下内容适用于12c版的Oracle:
delete from peoplecomments
where rowid not in
(
select rowid
from peoplecomments
order by row_number() over (partition by personid order by datefromcomment desc)
fetch first 10 rows with ties
);
除了ROWID
之外,这是标准的SQL。
在支持窗口函数和FETCH WITH TIES
的其他DBMS中
如果您的表有单列主键,则使用
ROWID
;如果表具有复合主键,则使用where (col1, col2) not in (select col1, col2 ...)
,前提是DBMS支持此语法。发布于 2020-02-29 14:00:55
您需要一个计算以下注释的相关子查询:
delete from peoplecomments pc
where
(
select count(*)
from peoplecomments pc2
where pc2.personid = pc.personid
and pc2.datefromcomment > pc.datefromcomment
) >= 10; -- at least 10 newer comments for the person
顺便说一句:虽然我们似乎可以简单地对行进行编号并相应地删除
delete from
(
select
pc.*, row_number() over (partition by personid order by datefromcomment desc) as rn
from peoplecomments pc
)
where rn > 10;
Oracle不允许这样做,因此给了我们ORA-01732: data manipulation operation not legal on this view
。
https://stackoverflow.com/questions/60465794
复制相似问题