如何在 Oracle 11g 的“选择”查询中添加偏移量?

Posted

技术标签:

【中文标题】如何在 Oracle 11g 的“选择”查询中添加偏移量?【英文标题】:How to add offset in a "select" query in Oracle 11g? 【发布时间】:2015-01-21 20:16:59 【问题描述】:

如何在 Oracle 11g 的“选择”查询中添加偏移量。 我只知道如何添加限制,例如 rownum <= 5 这个问题不是重复的,我已经检查了其他问题并且与我的无关。

那么,如何在 Oracle 11g 中添加偏移量?

【问题讨论】:

use-the-index-luke.com/sql/partial-results 这个问题应该改写,因为你对offset的含义可能与OFFSET子句相关,也可能不相关。 Paging with Oracle的可能重复 【参考方案1】:

您可以通过指定OFFSET12c 上轻松完成此操作。

12c

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

要在11g 和之前执行相同操作,您需要使用两次ROWNUM,分别为inner queryouter query

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。

【讨论】:

@psaraj12,如果您的意思是按降序获取行,那么只需在inner query 中使用DESC 如何用 LEFT OUTER JOIN 做到这一点? @Toolkit 没关系。您可以将结果集作为内部查询并应用 TOP N 查询。 @LalitKumarB 谢谢,我现在正在尝试使用作为 JOIN 查询的物化视图来执行此操作。知道如何根据父表进行分页吗?谢谢 @Toolkit 应用于结果集。或者使用 WITH 子句让它看起来更简单【参考方案2】:

您可以为此使用 ROW_NUMBER 函数。

也许这会有所帮助:

SELECT *
  FROM(SELECT t.*,
              ROW_NUMBER() OVER (ORDER BY ...) rn -- whatever ordering you want
         FROM your_table t
      )
 WHERE rn >= ... -- your offset

希望有帮助

【讨论】:

【参考方案3】:

在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)

请查找this link 示例

【讨论】:

您只需要ROWNUM @Lalit Kumar B. 只要涉及到限制输出中的行,您所写的内容就有意义。我想说这个问题并不完全清楚,应该重新措辞(偏移量可能有不同的理解)。【参考方案4】:

对于 oracle 11g,假设你有一个表用户,你可以做的限制和偏移:

    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

让我知道它是否适合你

【讨论】:

以上是关于如何在 Oracle 11g 的“选择”查询中添加偏移量?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle11g 带分页的选择查询

如何在 Oracle 11g 中选择前五行或“N”行 [重复]

Oracle 11g,如何加快“in”查询

如何在 Oracle 11g 中使用游标在表中插入数据?

Oracle 11g:查询不返回任何内容时默认为静态值

如何在 oracle db 11g - centos 6 中启用查询日志