我在Oracle上运行了这两个查询:
select B.* from (
select A.*, rownum as rn from (
select * from .... order by ...
) A ) B where B.rn > 0 and B.rn <=30;
和
select B.* from (
select A.*, rownum as rn from (
select * from .... order by ...
) A where rownum <= 30 ) B where rn > 0
事实上,这些查询的结果是不同的。第一个看起来更正确。为什么呢?
第二种方法的问题是: 当我以0-30的间隔运行它时,第一眼就看起来很好。但是当我以30-60的间隔运行它时,我发现30-60个结果确实包含了我在0-30结果中已经看到的条目(显然不应该发生)。
UPD :
我刚刚发现它可能无法正常工作,因为我的order by
子句产生的不是唯一的排序。所以它不是按PK排序,而是通过clientName排序,例如,结果中可能有大量相同的客户端。那么,这可能是原因吗?当订单实际上未定义时,oracle如何命令条目?如果我们在页面之间进行切换,则应该对分页顺序进行定义,以使结果保持稳定。
答案 0 :(得分:0)
您正在引用列别名“rn”,该别名派生自在应用orderby之前在内部查询中分配的rownum。
相反,在外部查询中引用rownum。
select *
from (
select *
from ...
order by ...
)
where rownum between 1 and 30;
或......
顺便说一下,Rownum 0不存在。
select *
from (
select a.*, rownum rn
from (
select *
from ...
order by ...
) a
where rownum < 60
)
where rn >= 30