`

Oracle中实现分页的SQL语句

阅读更多

写了两个有关分页的SQL 语句,希望对大家有点帮助...记住,只能在Oracle下使用

1 获取总页数

SELECT DECODE(mod(COUNT(*),100),0,COUNT(*)/100,TRUNC(COUNT(*)/100,0)+1)
AS  pages FROM XZQH 

 其中XZQH是表名,可以换成别的表格或者与别的表格相连或者加上查询条件....总之可以把XZQH换成FROM后的一切东西.

100是没页显示的记录数,换成你想要的!!!

生成结果是具有pages列的一个表格.可以用resultSet.getInt("pages")获得

2 获取特定的记录数据

SELECT x.* from (SELECT z.*,rownum numbers from XZQH z where rownum<101) x where x.numbers>90

 其中XZQH的含义与上述一样,可以换成你任何想要的条件和表连接

其中101和90是指定界限的数字,拿此例来说,是取出第90-----100条数据.

好了,点到为止..具体在实践中该怎么用,大家自己慢慢琢磨吧!!!

分享到:
评论
16 楼 zhiblin 2009-04-03  
这个帖子 真的不错 收藏了
15 楼 yong_kang 2009-03-19  
SELECT x.* from (
     SELECT z.*,rownum numbers from(
          select * from XZQH where XXX order by XXX) z
     where rownum<101) x
where x.numbers>90 
14 楼 yanchencheng 2008-11-23  
select * from dual;
13 楼 javaboy2006 2008-11-13  
返回有条件且经过排序的某段记录(三层结构)
select *
  from (select *
          from (select t.*, rownum num
                  from userinfo t
                 where siteid = 73
                 order by regtime desc)
         where num < 5)
 where num > 11;
12 楼 elstage 2008-11-12  
为什么我用between and 在翻页后就出错,取不到数据?
11 楼 ye_jinghua 2008-09-24  

超强的分页SQL
经过测试:
SELECT x.* from (SELECT z.*,rownum numbers from XZQH z where rownum<101) x where x.numbers>90  

在400000记录中进行分页查询只需0.4秒左右而其他的分页方法要6~13秒
10 楼 oboaix 2008-09-18  
必须使用内部order by 否则你的获取的数据 是不对的,这种使用分析函数:ROW_NUMBER() OVER(order by field)可以使用大数据量测试一把...
9 楼 tiandp007 2008-09-12  
<div class='quote_title'>mhqawjh 写道</div>
<div class='quote_div'>
<p>写了两个有关分页的SQL 语句,希望对大家有点帮助...记住,只能在Oracle下使用</p>
<p><strong><span style='color: #ff6600;'>1 获取总页数</span></strong></p>
<pre name='code' class='sql'>SELECT DECODE(mod(COUNT(*),100),0,COUNT(*)/100,TRUNC(COUNT(*)/100,0)+1)
AS  pages FROM XZQH </pre>
<p> 其中XZQH是表名,可以换成别的表格或者与别的表格相连或者加上查询条件....总之可以把XZQH换成FROM后的一切东西.</p>
<p>100是没页显示的记录数,换成你想要的!!!</p>
<p>生成结果是具有pages列的一个表格.可以用resultSet.getInt("pages")获得</p>
<p><span style='color: #ff6600;'><strong>2 获取特定的记录数据</strong></span></p>
<pre name='code' class='sql'>SELECT x.* from (SELECT z.*,rownum numbers from XZQH z where rownum&lt;101) x where x.numbers&gt;90</pre>
<p> 其中XZQH的含义与上述一样,可以换成你任何想要的条件和表连接</p>
<p>其中101和90是指定界限的数字,拿此例来说,是取出第90-----100条数据.</p>
<p>好了,点到为止..具体在实践中该怎么用,大家自己慢慢琢磨吧!!!</p>
</div>
<p> </p>
8 楼 percent 2008-08-24  
不加 order by 也不会出现:"第一页出现的数据,在第二页还出现"因为已经基于
rownum进行分页了
楼主写的两个 SQL 没有问题。

SQL> select temp.*
  2  from (select trunc(rownum/100,0)+1 group_n,
  3               mod(rownum,100) index_n,
  4               table_name.*--table_name is a table
  5        from table_name
  6        where rownum<=(10-1)*100+15  --若查询所有的,去除where
  7        )  temp
  8  where  group_n=10 and index_n between 5 and 10
  9  order by group_n asc,index_n asc
10  --results:
11  --检索记录从1组开始到10组的第15个元素终止
12  --then select index of 10 group's recorders between 5 and 10
13  /

   GROUP_N    INDEX_N            column
---------- ---------- -----------------
        10          5 1.00000000036492E
        10          6 1.00000000036493E
        10          7 1.00000000036507E
        10          8 1.00000000036581E
        10          9 1.00000000036657E
        10         10 1.00000000036667E
6 rows selected
SQL>
7 楼 yuechen323 2008-08-21  
armorking 用分析函数的方法是正确的 他楼下那个是错误的
6 楼 yuechen323 2008-08-21  
不用分析函数你这个到1万条以后翻页慢的要死,用分析函数最后一页慢的要死,就这些。看你的系统需求了,如果用户只对前面的数据感兴趣,你就加hint first_row
5 楼 honda418 2008-08-19  
feiji868 写道
我认为用这个比较好
select * from ( select row_.*, rownum rownum_ from (SELECT * FROM table ORDER BY table.id DESC) row_ where rownum <= ?) where rownum_ > ?



你仔细看看,跟2楼的有区别么?
4 楼 topcloud 2008-07-18  
注意需要排序是使用:
ROW_NUMBER() OVER (ORDER BY field1,field2) AS rowNummber

不然不能总体排序,而是页内排序。
3 楼 feiji868 2008-06-24  
我认为用这个比较好
select * from ( select row_.*, rownum rownum_ from (SELECT * FROM table ORDER BY table.id DESC) row_ where rownum <= ?) where rownum_ > ?
2 楼 armorking 2008-06-16  
laodizhuq 写道
应该是:
SELECT x.* from (
     SELECT z.*,rownum numbers from(
          select * from XZQH where XXX order by XXX) z
     where rownum<101) x 
where x.numbers>90  


否则你出来的结果不正确的



也可以直接用分析函数
SELECT X.* 
FROM (
    SELECT 
          ROW_NUMBER() OVER(order by XXX) AS numbers
        , XZQH.*
    FROM XZQH
    WHERE XXX
) X
WHERE X.numbers < 101 
    AND X.numbers > 90

1 楼 laodizhuq 2008-06-14  
应该是:
SELECT x.* from (
     SELECT z.*,rownum numbers from(
          select * from XZQH where XXX order by XXX) z
     where rownum<101) x 
where x.numbers>90  


否则你出来的结果不正确的

相关推荐

Global site tag (gtag.js) - Google Analytics