使用笛卡尔积进行分页

时间:2010-07-28 14:53:02

标签: java database hibernate pagination oracle9i

如果需要更多信息来回答此问题,请添加评论。

我们有一个返回笛卡尔积的查询。由于有很多结果,可能会有大量的物体被水化。我们想在数据库端进行简单的分页,因此它很快,所以它只从n *页开始拉n个结果,其中n表示为100。

我们遇到的麻烦是在查询上正在进行distinct,以便只返回必要的行。但是,这最终会过滤结果,因此您得到的结果将少于100.

正因为如此,即使我们有页码,我们也不知道从哪里开始或停止而不进行查询以首先看到起点(即我们不能使用rownum),并且可能循环直到我们得到100个结果,你明白了。这太乱了。

如果需要,我们可以直接进行SQL,但是重构表不是一种选择。

无论哪种方式,我无法想象我们是第一个遇到这种情况的人,所以我想知道是否有办法做到这一点。

提前致谢!

编辑: @ nicolas78发布了一条准确描述情况的评论。

1 个答案:

答案 0 :(得分:2)

您需要将DISTINCT进一步推送到查询中,以便在应用分页之前完成。例如:

select deptno from
  ( select deptno, rownum as rn from
      ( select DISTINCT deptno
        from   emp
        order by deptno
      )
    where rownum < :pagenum*100
  )
where rn > (:pagenum-1)*100;