【问题标题】:Get 1000 row set from Oracle table [duplicate]从 Oracle 表中获取 1000 行集 [重复]
【发布时间】:2015-10-02 14:30:43
【问题描述】:

我想使用查询一次选择 1000 行:

SELECT * FROM MEMBERID_1M WHERE ROWNUM <1000

如何在 for 循环中从此表中获取下一组 1000 行?

【问题讨论】:

  • 请注明Oracle版本。
  • 标准版一 - Oracle 11g

标签: sql oracle select


【解决方案1】:

我建议你像这样使用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)

【讨论】:

  • 它给出:ORA-00923: FROM 关键字未在预期的位置找到 00923. 00000 - “FROM 关键字未在预期的位置找到” *原因:*操作:第 10 行错误:第 13 列
  • 我忘记在内部选择中使用 * 之前的表名 ;)。
【解决方案2】:

复制answer

只有一种相当复杂的方法可以做到这一点,这对 Oracle 来说是一个真正的痛苦。他们应该只实现一个 LIMIT/OFFSET 子句...

在where 子句选择行之后分配rownum,因此rownum 必须始终以1 开头。where rownum &gt; 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

【讨论】:

    【解决方案3】:

    您应该在服务器端进行分页。使用此查询 更多详细信息请参阅此链接 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2019-03-20
      • 1970-01-01
      • 2020-10-15
      • 2020-04-24
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多