sql查询分页:两种方法之间有什么区别

时间:2012-05-30 13:34:42

标签: sql oracle pagination

我在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如何命令条目?如果我们在页面之间进行切换,则应该对分页顺序进行定义,以使结果保持稳定。

1 个答案:

答案 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