因此,我想在Oracle数据库中选择一系列行。我需要这样做是因为表中有数百万行,并且我想将结果分页给用户(如果您知道另一种在客户端执行此操作的方法,那么我正在使用JavaFX,但我没有认为通过网络发送所有数据以在客户端对它们进行分页是个好主意)。
我有以下查询:
Select * From (Select t.*, rownum r from PERSON t) Where r > 100 and r < 110;
该100
和110
只是例子。在应用程序中,我只是要求下限并添加10_000的大小以获取接下来的10_000行。
现在rownum列出现在结果中,我不想看到它。由于我对SQL不太熟悉,因此我有以下问题:
为什么(这是我第一次尝试,直到我搜索SO)Select * From Person Where rownum > 100 and rownum < 110;
返回0行?
为什么没有简单的方法可以做类似的事情Select ... FROM ... WHERE rownum BETWEEN lowerBound AND upperBound
?
如何摆脱r
结果值中的列?从那里SQL使用SELECT * columnA除外] FROM tableA排除一列?我显然需要创建一个视图或一个临时表,但是还有另一种考虑我的查询的方法吗?
它能确保正确的分页吗?我阅读了本文的“用ROWNUM进行分页”一节,说我应该按唯一的顺序对值进行排序以获得一致的分页(因此rownum
,如果可以确认的话,我认为按次排序就可以了)。它不会破坏使用的目的FIRST_ROWS(N)
吗?
我希望不要太多,我可以分为几个问题,但是我认为将它们折叠起来是很重要的,因为它们关系密切。
您有4个问题,所有问题都围绕 ROWNUM 的用法和功能。我将一个接一个地回答每个问题。
为什么(这是我第一次尝试,直到我搜索SO为止)选择* From Person where rownum> 100 and rownum <110;
返回0行?
Thomas Kyte在这里很好地解释了ROWNUM和分页。
甲 ROWNUM 它通过后值被分配给行 谓词相
的查询,但查询之前是否有任何分选或聚集。另外,仅在分配ROWNUM值后才递增它,这就是以下查询永远不会返回行的原因:
select *
from t
where ROWNUM > 1;
因为第一行的ROWNUM> 1不正确,所以ROWNUM不会前进到2。因此,任何ROWNUM值都不会大于1。
为什么没有简单的方法可以执行Select … FROM … lowerBound和upperBound之间的rownum呢?
就在这里。从 Oracle 12c 开始,您可以使用新的 Top-n行限制
功能。
例如,以下查询将按升序返回员工的 最高薪水 到 第 4 高薪 至 第7高薪 :
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上使用新的行限制功能。
所以我想在Oracle DB中选择一系列行。我需要这样做,因为我在表中有数百万行,我想将结果分页给用户(如果您知道在客户端执行此操作的另一种方法,如果重要的话,我正在使用JavaFX,但我认为通过网络发送所有数据以在客户端分页它们不是一个好主意)。 所以读完这篇文章:SQLROWNUM如何在特定范围之间返回行,我有以下疑问: 和就是一个例子。在应用程序中,我只需要求下限,然后添加一个10\u 00
我使用以下“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 当