我在 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 如何对条目进行排序?在分页顺序的情况下,应该非常定义,以便在我们在页面之间切换时结果稳定。