【发布时间】:2015-10-02 14:30:43
【问题描述】:
我想使用查询一次选择 1000 行:
SELECT * FROM MEMBERID_1M WHERE ROWNUM <1000
如何在 for 循环中从此表中获取下一组 1000 行?
【问题讨论】:
-
请注明Oracle版本。
-
标准版一 - Oracle 11g
我想使用查询一次选择 1000 行:
SELECT * FROM MEMBERID_1M WHERE ROWNUM <1000
如何在 for 循环中从此表中获取下一组 1000 行?
【问题讨论】:
我建议你像这样使用ROW_NUMBER()函数:(我的id是你的PK)
SELECT M.*
FROM (
SELECT MEMBERID_1M.*, ROW_NUMBER() OVER (ORDER BY id) As rn
FROM MEMBERID_1M ) M
WHERE
(rn <= 1000)
接下来:
SELECT M.*
FROM (
SELECT MEMBERID_1M.*, ROW_NUMBER() OVER (ORDER BY id) As rn
FROM MEMBERID_1M ) M
WHERE
(rn > 1000) AND (rn <= 2000)
对于页面:i:
SELECT M.*
FROM (
SELECT MEMBERID_1M.*, ROW_NUMBER() OVER (ORDER BY id) As rn
FROM MEMBERID_1M ) M
WHERE
(rn > :i * 1000) AND (rn <= (:i + 1) * 1000)
【讨论】:
复制answer
只有一种相当复杂的方法可以做到这一点,这对 Oracle 来说是一个真正的痛苦。他们应该只实现一个 LIMIT/OFFSET 子句...
在where 子句选择行之后分配rownum,因此rownum 必须始终以1 开头。where rownum > x 将始终评估为false。
此外,rownum 在排序完成之前被分配,因此 rownum 的顺序与您所说的顺序不同。
您可以通过子选择解决这两个问题:
select a,b,c, rn from
( select a,b,c, rownum rn from
( select a,b,c from the_table where x = ? order by c)
where rownum < Y)
where rn > X
如果你不需要排序(但只有这样),你可以简化为
select a,b,c, rn from
( select a,b,c, rownum rn from the_table where rownum < Y )
where rn > X
【讨论】:
您应该在服务器端进行分页。使用此查询 更多详细信息请参阅此链接 http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o17asktom-093877.html
select *
from
( select rownum rnum, a.*
from (SELECT * FROM MEMBERID_1M ) a
where rownum <= :M )
where rnum >= :N;
【讨论】: