【发布时间】:2011-05-31 23:12:10
【问题描述】:
如何返回特定范围的 ROWNUM 值?
我正在尝试以下方法:
select * from maps006 where rownum >49 and rownum <101
这仅返回与< 运算符匹配的行。
【问题讨论】:
标签: sql database oracle rownum
如何返回特定范围的 ROWNUM 值?
我正在尝试以下方法:
select * from maps006 where rownum >49 and rownum <101
这仅返回与< 运算符匹配的行。
【问题讨论】:
标签: sql database oracle rownum
SELECT * from
(
select m.*, rownum r
from maps006 m
)
where r > 49 and r < 101
【讨论】:
SELECT col1,col2,col3 from 其中 col1、col2 等将是除 r 之外的所有列的名称
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable
WHERE RowNum BETWEEN 49 AND 101
【讨论】:
SELECT *
FROM (
SELECT q.*, rownum rn
FROM (
SELECT *
FROM maps006
ORDER BY
id
) q
)
WHERE rn BETWEEN 50 AND 100
注意双重嵌套视图。 ROWNUM 在ORDER BY 之前被评估,因此它是正确编号所必需的。
如果省略ORDER BY 子句,您将无法获得一致的顺序。
【讨论】:
select * from (SELECT tab.*, rownum r FROM table1 tab order by cft.confrm_fraud_id) tab1 WHERE tab1.r BETWEEN 10 AND 20
confrm_fraud_id 的顺序读取记录,很可能在其上使用索引。你不能依赖这种行为。比较这两个查询:sqlfiddle.com/#!4/4730c5/5(不正确)和sqlfiddle.com/#!4/4730c5/7(正确)。请注意,在不正确的查询中,ROWNUM 的顺序甚至是错误的。
ROWNUM BETWEEN 11 AND 20 对具有12 行的结果集进行分页,但得到0 任何以>1 开头的范围的记录。感谢您的提示!
您也可以使用 CTE with 子句。
WITH maps AS (Select ROW_NUMBER() OVER (ORDER BY Id) AS rownum,*
from maps006 )
SELECT rownum, * FROM maps WHERE rownum >49 and rownum <101
【讨论】:
select *
from emp
where rownum <= &upperlimit
minus
select *
from emp
where rownum <= &lower limit ;
【讨论】:
我一直在寻找解决方案,发现这很棒 article explaining the solution 相关摘录
我最喜欢的 ROWNUM 用法是分页。在这种情况下,我使用 ROWNUM 获取结果集的 N 到 M 行。一般形式为 如下:
select * enter code here
from ( select /*+ FIRST_ROWS(n) */
a.*, ROWNUM rnum
from ( your_query_goes_here,
with order by ) a
where ROWNUM <=
:MAX_ROW_TO_FETCH )
where rnum >= :MIN_ROW_TO_FETCH;
现在有一个真实的例子(获取第 148、149 和 150 行):
select *
from
(select a.*, rownum rnum
from
(select id, data
from t
order by id, rowid) a
where rownum <= 150
)
where rnum >= 148;
【讨论】:
我知道这是一个老问题,但是,在最新版本中提及新功能很有用。
从 Oracle 12c 开始,您可以使用新的 Top-n Row 限制功能。无需编写子查询,不依赖 ROWNUM。
例如,下面的查询将按升序返回薪金从第 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>
【讨论】: