您有 4 个问题,全部围绕ROWNUM。我将一一回答每个问题。
为什么(这是我第一次尝试,直到我搜索 SO) Select * From PersonWhere rownum > 100 and rownum
Thomas Kyte 关于 ROWNUM 和分页的很好的解释here https://asktom.oracle.com/Misc/oramag/on-rownum-and-limiting-results.html.
A ROWNUM值通过后被分配给一行谓词阶段查询的但在查询执行任何排序或聚合之前。此外,ROWNUM 值仅在分配后才会递增,这就是以下查询永远不会返回行的原因:
select *
from t
where ROWNUM > 1;
由于第一行的 ROWNUM > 1 不成立,因此 ROWNUM 不会前进到 2。因此,ROWNUM 值不会大于 1。
为什么没有简单的方法来执行 Select ... FROM ... WHERE rownum BETWEEN lowerBound AND upperBound 之类的操作?
就在这里。从甲骨文12c从那时起,您可以使用新的前 n 行限制特征。在这里查看我的答案 https://stackoverflow.com/a/29411029/3989608.
例如,以下查询将返回介于第四高 till 薪资排名第七按升序排列:
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 上的新行限制功能,如我上面所示。
几个好的例子here http://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php.