所以我想在Oracle数据库来选择行的范围。 我需要这样做,因为我有几百万的表中的行,我想分页结果给用户(如果你知道另一种方式来做到这一点在客户端,我使用JavaFX如果它很重要,但我不知道认为这是把所有的DATAS通过网络进行分页他们在客户端)是一个好主意。
所以,阅读这篇文章后: SQL ROWNUM如何在特定的范围之间返回行 ,我有以下查询:
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表A? 我显然需要创建一个视图或临时表,但有没有考虑我的查询另一种方式?
它确保正确的分页? 我读了这篇文章节“分页与ROWNUM”,是说我应该通过唯一获得一致的分页东西责令值(所以我想通过订购rownum
是好的,如果你能确认)。 难道不是打败使用的目的FIRST_ROWS(N)
我希望它不是太多,我会分裂成不同的问题,但我认为这是相关的,让他们崩溃了,因为它们是密切相关的。
谢谢 :)
你有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限制功能如我上面显示。
几个很好的例子在这里 。
回答问题2:在Oracle 12,您可以使用分页
select owner, object_name, object_id
from t
order by owner, object_name
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;
我平时写这样的查询:
select *
from
(
select a.*, rownum as rn
from table_name a
where rownum <= 110
)
where rn > 100