有没有办法使一个Oracle查询行为像它包含一个MySQL限制子句?
在MySQL中,我可以这样做:
select *
from sometable
order by name
limit 20,10
要得到第21行到第30行(跳过前20行,给出接下来的10行)。这些行是按顺序选择的,所以实际上是从第20个名字的字母顺序开始的。
在Oracle中,人们唯一提到的是rownum伪列,但它在order by之前求值,这意味着:
select *
from sometable
where rownum <= 10
order by name
将返回一个随机的10行按名称排序的集合,这通常不是我想要的。它也不允许指定偏移量。
select * FROM (SELECT
ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID,
FROM EMP ) EMP where ROWID=5
大于数值
select * FROM (SELECT
ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID,
FROM EMP ) EMP where ROWID>5
更少的价值发现
select * FROM (SELECT
ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID,
FROM EMP ) EMP where ROWID=5
您可以为此使用子查询
select *
from
( select *
from emp
order by sal desc )
where ROWNUM <= 5;
还可以查看Oracle/AskTom上的关于ROWNUM和限制结果的主题以获得更多信息。
更新:
为了同时限制结果的下界和上界,事情变得有点臃肿
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-article)
更新2:
从Oracle 12c(12.1)开始,就有了限制行或从偏移量开始的语法。
SELECT *
FROM sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
更多的例子请看这个答案。谢谢克鲁米亚的提示。