如何在 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】:您可以通过指定OFFSET
在12c
上轻松完成此操作。
在12c
,
SELECT val
FROM table
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
要在11g
和之前执行相同操作,您需要使用两次ROWNUM
,分别为inner query
和outer 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 的“选择”查询中添加偏移量?的主要内容,如果未能解决你的问题,请参考以下文章