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

ROWNUM如何在分页查询中工作?

梁丘安晏
2023-03-14

所以我想在Oracle DB中选择一系列行。我需要这样做,因为我在表中有数百万行,我想将结果分页给用户(如果您知道在客户端执行此操作的另一种方法,如果重要的话,我正在使用JavaFX,但我认为通过网络发送所有数据以在客户端分页它们不是一个好主意)。

所以读完这篇文章:SQLROWNUM如何在特定范围之间返回行,我有以下疑问:

Select * From (Select t.*, rownum r from PERSON t) Where r > 100 and r < 110;

100110就是一个例子。在应用程序中,我只需要求下限,然后添加一个10\u 000的大小来获取接下来的10\u 000行。

现在rownum列出现在结果中,我不想看到它。由于我对SQL不是很有经验,以下是我的问题:

>

  • 为什么(这是我第一次尝试,直到我在SO上搜索)Select*From Person何处rownum

    为什么没有简单的方法来做像Select... from... WHERE rownum BETWEEN lowerBound和upperBound这样的事情?

    如何去掉结果值中的r列?从那里,SQL使用SELECT*[除了columnA]从tableA中排除列?显然,我需要创建一个视图或临时表,但是否有其他方法可以考虑我的查询?

    它是否确保正确分页?我读了这篇文章的“使用ROWNUM分页”一节,它说我应该按唯一的方式对值排序,以获得一致的分页(因此,如果可以确认的话,我想按ROWNUM排序是可以的)。它是否违背了使用第一行(N)的目的?

    我希望这不算太多,我可以分为几个单独的问题,但我认为让它们崩溃是相关的,因为它们是密切相关的。


  • 共有3个答案

    危钱明
    2023-03-14

    我通常编写如下查询:

    select * 
    from 
    (
        select a.*, rownum as rn  
        from table_name a
        where rownum <= 110
    )
    where rn > 100 
    
    山乐生
    2023-03-14

    对问题2的回答:在Oracle 12中,可以使用分页

    select owner, object_name, object_id
    from t
    order by owner, object_name
    OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;
    
    融建树
    2023-03-14

    您有4个问题,都围绕ROWNUM的用法和功能展开。我将逐一回答每个问题。

    为什么(这是我在SO上搜索之前的第一次尝试)从rownum所在的人中选择*

    托马斯·凯尔特(ThomasKyte)关于ROWNUM和分页的解释很好。

    在行通过查询的谓词阶段之后,但在查询进行任何排序或聚合之前,会将ROWNUM值分配给行。此外,ROWNUM值只有在赋值后才会递增,这就是为什么以下查询永远不会返回行的原因:

    select * 
      from t 
     where ROWNUM > 1;
    

    因为ROWNUM

    为什么没有简单的方法来做这样的事情选择... from...在哪里rownum低界和上界?

    是的,有。从Oracle 12c开始,您可以使用新的Top-n行限制功能。在这里查看我的答案。

    例如,下面的查询将按升序返回工资在第四高到第七高之间的员工:

    SQL> SELECT empno, sal
      2  FROM   emp
      3  ORDER BY sal
      4  OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
    
         EMPNO        SAL
    ---------- ----------
          7654       1250
          7934       1300
          7844       1500
          7499       1600
    
    SQL>
    

    如何去掉结果值中的r列?

    代替选择*,在外部查询中列出所需的列名。对于频繁使用查询,创建视图是一个简单的一次性活动。

    或者,在SQL*Plus中,您可以使用NOPRINT命令。它不会显示您不想显示的列名。但是,它只适用于SQL*Plus。

    例如,

    COLUMN column_name NOPRINT
    

    例如,

    SQL> desc dept
     Name                                      Null?    Type
     ----------------------------------------- -------- ------------
     DEPTNO                                             NUMBER(2)
     DNAME                                              VARCHAR2(14)
     LOC                                                VARCHAR2(13)
    
    SQL> COLUMN dname NOPRINT
    SQL> COLUMN LOC NOPRINT
    SQL> SELECT * FROM dept;
    
        DEPTNO
    ----------
            10
            20
            30
            40
    
    SQL>
    

    它是否确保正确的分页?

    是的,如果正确编写分页查询。

    例如,

    SELECT val
    FROM   (SELECT val, rownum AS rnum
            FROM   (SELECT val
                    FROM   t
                    ORDER BY val)
            WHERE rownum <= 8)
    WHERE  rnum >= 5;
    
           VAL
    ----------
             3
             3
             4
             4
    
    4 rows selected.
    
    SQL>
    

    或者,使用12c上的新行限制功能,如上所示。

    这里有几个好例子。

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

    • 我使用以下“wapper”在少数情况下实现分页,并且通常将其称为“标准分页选择”。因此,要对任何select语句的结果进行分页,只需将select语句包装在“标准分页选择”中。 我的问题是关于分页位的行为和ROWNUM的魔力。据我了解,子查询并不是每次都选择完整的结果集,而是在寻找确认或其他方式? 下面是对上面显示的分页行为的正确描述,例如,如果页面大小为50: 要选择: 第1页(例如0-50)子

    • 使用带有规范和分页的Eclipse Link JPA 2.5.2,我对Oracle ROWNUM的执行方式有问题。Eclipse Link生成的查询如下: 为第一页运行该查询应返回0到25之间的行,为第二页运行相同的查询应返回25到50之间的行。 问题是第一页的记录也出现在第二页,我猜是因为submitteddate可以包含NULL值并且ORDER BY子句在ROWNUM和rnum条件或类似的东西

    • 使用数据库的应用程序,多数情况下都需要使用 “分页” 这个功能。尤其是在 Web 应用程序中,后端的分页查询尤其的普遍。 在以往的使用经验中,一个分页查询,除了能获取到一个列表外,我们通常需要如下几个信息才能在客户端显示出一个完整的翻页条。 当前页数 -- 第几页 页大小 -- 每页有多少条记录 总页数 -- 一共多少页 总记录数 -- 如果不分页,一共有多少条记录 当我们获得了这四条信息后,对于

    • limt 分页查询 查询前3条记录 分页公式: (offset - 1) * limit SELECT name FROM `student` LIMIT 0, 3; Student.findAll( { attributes:['name'], // 当前页 offset:0, // 每页显示的条数 limit:3 }) 分页案例 router.ge

    • 在使用 hyperf/database 来查询数据时,可以很方便的通过与 hyperf/paginator 组件配合便捷地对查询结果进行分页。 使用方法 在您通过 查询构造器 或 模型 查询数据时,可以通过 paginate 方法来处理分页,该方法会自动根据用户正在查看的页面来设置限制和偏移量,默认情况下,通过当前 HTTP 请求所带的 page 参数的值来检测当前的页数: 由于 Hyperf 当