1

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

4

1 回答 1

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
于 2012-05-30T13:53:39.583 回答