ROWNUM是如何工作的分页查询?ROWNUM是如何工作的分页查询?(How ROWNUM work

2019-05-10 12:27发布

所以我想在Oracle数据库来选择行的范围。 我需要这样做,因为我有几百万的表中的行,我想分页结果给用户(如果你知道另一种方式来做到这一点在客户端,我使用JavaFX如果它很重要,但我不知道认为这是把所有的DATAS通过网络进行分页他们在客户端)是一个好主意。

所以,阅读这篇文章后: SQL ROWNUM如何在特定的范围之间返回行 ,我有以下查询:

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

100110只是示例。 在应用方面,我只问了下界,并添加尺寸10_000的读取下一10_000行。

现在ROWNUM列将出现在结果,我不希望看到它。 由于我不是非常有经验的SQL,这是我的问题:

  1. 为什么?(这是我第一次尝试,直到我上搜索SO) Select * From Person Where rownum > 100 and rownum < 110; 返回0行?
  2. 为什么有没有简单的方法做类似Select ... FROM ... WHERE rownum BETWEEN lowerBound AND upperBound

  3. 如何摆脱的r的结果值列? 从那里SQL排除使用SELECT *列[除columnA] FROM表A? 我显然需要创建一个视图或临时表,但有没有考虑我的查询另一种方式?

  4. 它确保正确的分页? 我读了这篇文章节“分页与ROWNUM”,是说我应该通过唯一获得一致的分页东西责令值(所以我想通过订购rownum是好的,如果你能确认)。 难道不是打败使用的目的FIRST_ROWS(N)

我希望它不是太多,我会分裂成不同的问题,但我认为这是相关的,让他们崩溃了,因为它们是密切相关的。

谢谢 :)

Answer 1:

你有4个问题,一切围绕ROWNUM的使用和功能旋转。 我会回答每一个问题一个接一个。

为什么?(这是我第一次尝试,直到我上搜索SO)SELECT * FROM人凡ROWNUM> 100和ROWNUM <110; 返回0行?

由托马斯·凯特关于ROWNUM和分页尼斯解释这里 。

它通过查询谓词相之后但在查询之前是否有任何分选或聚集甲ROWNUM值被分配给一个行。 此外,ROWNUM值增加它只能分配后,这就是为什么下面的查询将永远不会返回一行:

select * 
  from t 
 where ROWNUM > 1;

因为ROWNUM> 1不是第一行真,ROWNUM不会进到2。因此,没有ROWNUM值还未获得大于1。

为什么有没有简单的方法做类似选择... FROM ... WHERE ROWNUM BETWEEN下界到UPPERBOUND?

就在这里。 从甲骨文12C起,你可以使用新的前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列的?

相反的select * ,列出在外部查询所需的列名。 对于经常使用的查询,创建视图是一个简单的一次活动。

或者,在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限制功能如我上面显示。

几个很好的例子在这里 。



Answer 2:

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

select owner, object_name, object_id
from t
order by owner, object_name
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;


Answer 3:

我平时写这样的查询:

select * 
from 
(
    select a.*, rownum as rn  
    from table_name a
    where rownum <= 110
)
where rn > 100 


文章来源: How ROWNUM works in pagination query?