有没有一种方法可以使Oracle查询的行为类似于包含MySQLlimit子句的行为?
Oracle
limit
在MySQL中,我可以这样做:
select * from sometable order by name limit 20,10
以获得第21到30行(跳过前20行,给出下10行)。这些行是在后面选择的order by,因此它实际上是按字母顺序从第20个名称开始。
order by
在Oracle中,人们唯一提到的是rownum伪列,但是它 在之前 被评估order by,这意味着:
rownum
select * from sometable where rownum <= 10 order by name
将返回一个随机的十行,按名称排序,这通常不是我想要的。它还不允许指定偏移量。
从Oracle 12C R1(12.1)开始,那里 是 一个行限制性条款。它不使用熟悉的LIMIT语法,但是可以通过更多选项更好地完成这项工作。您可以在此处找到完整的语法。(还可以在此答案中阅读有关Oracle内部如何工作的更多信息)。
LIMIT
要回答原始问题,以下是查询:
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.
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.