当前位置: 首页 > 知识库问答 >
问题:

分页select语句和ROWNUM中包装的子查询的行为

柯乐童
2023-03-14

我使用以下“wapper”在少数情况下实现分页,并且通常将其称为“标准分页选择”。因此,要对任何select语句的结果进行分页,只需将select语句包装在“标准分页选择”中。

    SELECT * FROM (SELECT a.*, ROWNUM rnum FROM ((


    ( subquery:  put your select * from .......  here ..)


)) a WHERE ROWNUM  <=  ${resultEnd} ) 
WHERE rnum  >=  ${resultStart}

我的问题是关于分页位的行为和ROWNUM的魔力。据我了解,子查询并不是每次都选择完整的结果集,而是在寻找确认或其他方式?

下面是对上面显示的分页行为的正确描述,例如,如果页面大小为50:

要选择:

  • 第1页(例如0-50)子查询选择0-50行
  • 第2页(例如51-100)子查询选择0-100行(外部查询然后将其限制为50-100)
  • 第3页(例如101-150)子查询选择0-150行(外部查询然后将其限制为101-150)
  • 第4页(例如151-200)子查询选择0-200行(外部查询然后将其限制为151-200)
  • 第5页(例如201-250)子查询选择0-250行(外部查询然后将其限制为201-250)

...等等,你可以看到模式。

您越深入“页面”,子查询必须做的工作就越多。这是正确的吗?如果是这样,ROWNUM是如何做到这一点的?

提前谢谢。感谢您的反馈

共有2个答案

阳枫涟
2023-03-14

如果查询索引良好且性能良好,为什么不尝试使用物化视图呢?您可以将rownum定义为列,并根据需要刷新视图。也只是提醒一下。。Oracle 12C非常支持分页类型查询。

桑睿识
2023-03-14

你的理解大体上是正确的。内部rownum

动态生成rownum,优化器知道rownum

但是不能保证内部选择会短暂停止。特别是,其中的order by子句可能会强制生成整个结果集,然后rownum过滤器只是丢弃在该间隔之外生成的行。

 类似资料:
  • 问题内容: 将SELECT查询放在UPDATE查询的WHERE子句中时出现错误。 我的查询是这样的: AND错误将显示如下: “无法在FROM子句中指定目标表’m’进行更新” 问题答案: 实际上,您可以通过将其包装在子查询中来更新它(从而为结果创建临时表) 或使用 JOIN

  • 问题内容: 我有两个表,我需要创建一个视图。这些表是: 我使用以下查询来执行此操作。不带“创建视图”部分的查询运行良好,但带有“创建视图”的查询则显示错误“视图的SELECT在FROM子句中包含子查询”。可能是什么问题和可能的解决方案: 问题答案: 根据文档: MySQL文档 SELECT语句在FROM子句中不能包含子查询。 解决方法是为每个子查询创建一个视图。 然后从您的视图中访问这些视图

  • 我有一个Spring Boot应用程序。在其中,我有一个SQL查询,需要创建一个子查询,内部将该子查询的结果与另一个表连接,然后从该内连接的结果中进行选择。但是很明显,JPA不允许您在OF子句中使用子查询(我假设既不使用JPQL也不使用Criteria API)。有没有办法绕过这个? 我考虑过将子查询的结果存储在一个临时实体中(理想情况下不创建可持久化到DB的表),然后从存储在这些实体中的数据中进

  • 问题内容: 我到处都在寻找解释,以了解选择语句中的子查询如何工作,但由于解释非常模糊,我仍然无法理解该概念。 我想知道您如何在oracle的select语句中使用子查询以及它的确切输出。 例如,如果我有一个查询,希望显示这些表中员工的姓名及其管理的个人资料数量 员工(EmpName,EmpId) Profile(ProfileId,…,EmpId) 如何使用子查询? 我当时想在select语句中需

  • 在尝试从oracle11g数据库获取分页对象列表时,我面临一个很大的性能问题。 据我所知,以及我在网上查过的情况,在oracle11g中实现分页的唯一方法如下:示例:[页面=1,大小=100] 此查询中的问题是,从表“table\u NAME”中获取数据的最内部查询返回了大量数据,导致整个查询需要8秒钟(应用where子句后返回了大约200万条记录,其中包含9或10个join子句)。 这是因为最内

  • 问题内容: 因此,我想在Oracle数据库中选择一系列行。我需要这样做是因为表中有数百万行,并且我想将结果分页给用户(如果您知道另一种在客户端执行此操作的方法,那么我正在使用JavaFX,但我没有认为通过网络发送所有数据以在客户端对它们进行分页是个好主意)。 我有以下查询: 该和只是例子。在应用程序中,我只是要求下限并添加10_000的大小以获取接下来的10_000行。 现在rownum列出现在结