sql - 如何限制 Oracle 查询排序后返回的行数?

标签 sql oracle pagination sql-limit

有没有办法让 Oracle 查询的行为就像包含 MySQL limit 子句一样?

在 MySQL 中,我可以这样做:

select * 
from sometable
order by name
limit 20,10

获取第 21 行到第 30 行(跳过前 20 行,给出接下来的 10 行)。这些行是在 order by 之后选择的,因此它实际上按字母顺序从第 20 个名称开始。

在Oracle中,人们唯一提到的是rownum伪列,但它是在order by之前评估的,这意味着这个:

select * 
from sometable
where rownum <= 10
order by name

将返回按名称排序的随机十行集,这通常不是我想要的。它也不允许指定偏移量。

最佳答案

您可以使用子查询,例如

select *
from  
( select * 
  from emp 
  order by sal desc ) 
where ROWNUM <= 5;

另请查看主题 On ROWNUM and limiting results请访问 Oracle/AskTom 了解更多信息。

更新: 为了限制结果的下限和上限,事情会变得更加臃肿

select * from 
( select a.*, ROWNUM rnum from 
  ( <your_query_goes_here, with order by> ) a 
  where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum  >= :MIN_ROW_TO_FETCH;

(从指定的 AskTom 文章复制)

更新 2: 从 Oracle 12c (12.1) 开始,有一种语法可用于限制行或从偏移量开始。

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

参见this answer了解更多示例。感谢 Krumia 的提示。

关于sql - 如何限制 Oracle 查询排序后返回的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/470542/

相关文章:

pagination - 如何自定义 Pagination::slider View

sql - 分页表另一个Sql问题

sql - 使用动态枢轴功能从水平到垂直显示

sql - 在 Redshift 中生成随机数后,如何防止在同一查询中更改其值?

sql - 在 Oracle IN 子句中使用 LIKE

java - ORACLE中与JPA复合PK出现ORA-00904错误

php - 如何在数组中添加 PHP 分页

sql - 当我创建一个数据库时,azure 会创建一个额外的数据库

SQL 按 LIKE 模式分组

SQL 'FROM' 不在预期位置