小编典典

订购后如何限制Oracle查询返回的行数?

sql

有没有一种方法可以使Oracle查询的行为类似于包含MySQLlimit子句的行为?

在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

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


阅读 187

收藏
2021-05-05

共1个答案

小编典典

从Oracle 12C R1(12.1)开始,那里 一个行限制性条款。它不使用熟悉的LIMIT语法,但是可以通过更多选项更好地完成这项工作。您可以在此处找到完整的语法。(还可以在此答案中阅读有关Oracle内部如何工作的更多信息)。

要回答原始问题,以下是查询:

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

(对于早期的Oracle版本,请参考此问题中的其他答案)


例子:

链接页面引用了以下示例,以防止链接腐烂。

设置

CREATE TABLE rownum_order_test (
  val  NUMBER
);

INSERT ALL
  INTO rownum_order_test
SELECT level
FROM   dual
CONNECT BY level <= 10;

COMMIT;

桌子上有什么?

SELECT val
FROM   rownum_order_test
ORDER BY val;

       VAL
----------
         1
         1
         2
         2
         3
         3
         4
         4
         5
         5
         6
         6
         7
         7
         8
         8
         9
         9
        10
        10

20 rows selected.

获取第一N

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;

       VAL
----------
        10
        10
         9
         9
         8

5 rows selected.

获得第一N行中,如果N日行有关系,让所有的束缚行

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS WITH TIES;

       VAL
----------
        10
        10
         9
         9
         8
         8

6 rows selected.

x行的前%

SELECT val
FROM   rownum_order_test
ORDER BY val
FETCH FIRST 20 PERCENT ROWS ONLY;

       VAL
----------
         1
         1
         2
         2

4 rows selected.

使用偏移量,对分页非常有用

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

       VAL
----------
         3
         3
         4
         4

4 rows selected.

您可以将偏移量与百分比结合起来

SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 20 PERCENT ROWS ONLY;

       VAL
----------
         3
         3
         4
         4

4 rows selected.
2021-05-05