首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除从sql获得的每个组的行号大于指定的行号的寄存器

删除从sql获得的每个组的行号大于指定的行号的寄存器
EN

Stack Overflow用户
提问于 2020-02-29 13:45:31
回答 2查看 32关注 0票数 0

我在博客上有一张写着评论的人的桌子。我需要留下表中每一个人的最后10条评论,并删除旧的评论。让我们说这些列是:

  • dateFromComment

  • personId
  • commentId

我知道如何使用多个查询,但不只是一个查询(允许任何子查询)和anyDatabase

通过以下方式:

代码语言:javascript
运行
复制
select personId from PeopleComments 
group by personId
having count(*) >10 

我会得到超过10个评论的个人I,但我不知道如何从那里获得注释I并删除它们。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-29 14:21:46

在我的另一个答案中,DBMS必须为表中的每一行查找和计数行。这会很慢。最好找到我们希望保留的所有行,然后删除其他行。因此,这个额外的答案。

以下内容适用于12c版的Oracle:

代码语言:javascript
运行
复制
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支持此语法。
票数 1
EN

Stack Overflow用户

发布于 2020-02-29 14:00:55

您需要一个计算以下注释的相关子查询:

代码语言:javascript
运行
复制
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

顺便说一句:虽然我们似乎可以简单地对行进行编号并相应地删除

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60465794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档