如何在Oracle 11g的"select"查询中添加偏移量?

14
如何在Oracle 11g的"select"查询中添加偏移量。 我只知道如何通过例如rownum <= 5来添加限制。 这个问题不是重复的,我已经检查过其他问题,并与我的问题无关。 那么,在Oracle 11g中如何添加偏移量呢?

3
http://use-the-index-luke.com/sql/partial-results - user330315
问题应该重新措辞,因为您对偏移量的理解可能与OFFSET子句无关。 - Witold Kaczurba
可能是Paging with Oracle的重复问题。 - Vadzim
6个回答

26

通过在 12c 中指定 OFFSET,您可以轻松地完成此操作。

12c 中,

SELECT val
FROM   table
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

11g 和之前的版本中,为了实现相同的功能,您需要分别在 内部查询外部查询 中使用两次 ROWNUM

11g 中,相同的查询如下:

SELECT val
FROM   (SELECT val, rownum AS rnum
        FROM   (SELECT val
                FROM   table
                ORDER BY val)
        WHERE rownum <= 8)
WHERE  rnum > 4;

这里的OFFSET是4。


1
@psaraj12,如果您想按降序获取行,则只需在“内部查询”中使用“DESC”。 - Lalit Kumar B
如何使用LEFT OUTER JOIN实现这个? - Toolkit
@Toolkit无所谓。您可以将结果集设置为内部查询并应用TOP N查询。 - Lalit Kumar B
@LalitKumarB 谢谢,我现在正在尝试使用一个JOIN查询的材料化视图来实现这个。您有任何关于如何基于父表进行分页的想法吗?谢谢。 - Toolkit
@Toolkit 应用于结果集。或者使用 WITH 子句使其看起来更简单。 - Lalit Kumar B

3
你可以使用ROW_NUMBER函数来实现。
也许这会有所帮助:
SELECT *
  FROM(SELECT t.*,
              ROW_NUMBER() OVER (ORDER BY ...) rn -- whatever ordering you want
         FROM your_table t
      )
 WHERE rn >= ... -- your offset

希望能对您有所帮助。

1

对于 Oracle 11g,假设您有一个名为 user 的表格,您可以使用以下方式进行限制和偏移量:

    SELECT * FROM (
         SELECT USER.*,
                row_number() over (partition by 1 order by 1) as rnum
         from USER
     )
where rnum <= 100 --limit
  and rnum > 0 --offset

请您确认是否适用,如有需要请告知。

0
使用Oracle中的LAG或LEAD函数。
The LAG function is used to access data from a previous row

The LEAD function is used to return data from the next row

使用方法:

LAG  (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)
LEAD (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)

请点击 这个链接 查看示例


你所需要的只是 ROWNUM - Lalit Kumar B
@Lalit Kumar B. 你所写的在限制输出行方面是有意义的。我认为问题并不十分清晰,应该重新措辞(offset 可能会被理解得不同)。 - Witold Kaczurba

0
在Oracle 11g中进行分页,我们可以使用ROWNUM。以下是示例。
WITH STUDENT_PAGINATION AS (
    SELECT
        STUDENT.*,
        ROWNUM AS RN
    FROM
        STUDENT
    ORDER BY
        ID
)
SELECT
    *
FROM
    STUDENT_PAGINATION
WHERE
    RN >=5
    AND RN <=10;

0

对于Oracle 11g

根据@Ibrahima Timera的回答,但是具有类似Postgres的LIMIT和OFFSET的行为,具体如下:

  • LIMIT = 最大获取的行数
  • OFFSET = 第一个获取的元素之前跳过的行数

在下面的示例中,对于一个USER表,LIMIT为10,OFFSET为50:

SELECT * FROM (
         SELECT USER.*,
                row_number() over (partition by 1 order by 1) as rnum
         from USER
     )
where rnum <= (10 + 50) -- LIMIT + OFFSET
and rnum > 50 -- OFFSET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接