`

ORACLE中用rownum分页并排序的SQL语句

阅读更多

ORACLE中用rownum分页并排序的SQL语句
以前分页习惯用这样的SQL语句:

 

1
2
3
select * from
   (select t.*,rownum row_num from mytable t order by t.id) b
where b.row_num between 1 and 10

 

 

结果发现由于该语句会先生成rownum 后执行order by 子句,因而排序结果根本不对,后来在GOOGLE上搜到一篇文章,原来多套一层select 就能很好的解决该问题,特此记录,语句如下:

 

1
2
3
4
5
select * from
   (select a.*,rownum row_num from
      (select * from mytable t order by t.id desc) a
   ) b
where b.row_num between 1 and 10

 


==== 参考 ====

http://yangtingkun.itpub.net/post/468/100278

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。分页查询格式:

 

1
2
3
4
5
6
7
SELECT * FROM
(
   SELECT A.*, ROWNUM RN
   FROM (SELECT * FROM TABLE_NAME) A
   WHERE ROWNUM <= 40
)
WHERE RN >= 21

 

 

其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

 

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

 

选择第21 到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

 

1
2
3
4
5
6
SELECT * FROM
(
   SELECT A.*, ROWNUM RN
   FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40

 

 

对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

 

http://www.javaworld.com.tw/jute/post/view?bid=21&id=52022&sty=1&tpg=1&age=-1

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT * FROM
     (SELECT A.*, rownum r
       FROM
          -- 這裡的SQL可以改成你真正要執行的SQL
          (SELECT FROM Articles
           ORDER BY PubTime DESC
          ) A
          --
          -- 用上面的SQL得回來的集合,使用rownum去比對,這樣rownum就會從這   
             個集合的第一筆資料開始往下計算,所以這邊是抓取前100筆
          WHERE rownum <= 100
     ) B
         --  B集合總共有A集合和r(rownum)的資料,這裡是抓取大於第90筆的
         WHERE r > 90;
分享到:
评论

相关推荐

    简单页面jsp,java,oracle的增删改查并分页

    在本项目中,JDBC驱动被用来建立Java与Oracle的连接,执行SQL语句,并处理查询结果。 5. **SQL(Structured Query Language)**: SQL是用于管理和处理关系数据库的标准语言。在这个项目中,你需要了解基本的SQL...

    oracle scott 转成mysql 的表学习应用

    例如,Oracle中用ROWNUM伪列进行分页,而在MySQL中则使用LIMIT和OFFSET。 最后,了解和实践这个过程可以帮助我们更好地理解和比较两种数据库系统的特性,从而在实际工作中更高效地处理跨平台的数据迁移和管理任务。...

    Oracle常见面试题.pdf

    * 使用 SQL 语句写分页:在 SQLSERVER 中使用 TOP, 在 ORACLE 中用 ROWNUM 或分析函数 ROW_NUMBER。 * 使用存储过程写分页:在 ORACLE 中,要将过程封装在包里,还要用动态游标变量才能实现数据集的返回。 6. ...

    初学者写留言本,带分页的java+servlet+oracle!

    通过JDBC,我们可以执行SQL语句,插入、更新和查询数据。 - **CRUD操作**:创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete),是数据库操作的基本动作。在留言本中,我们需要实现这些操作来管理留言。 3...

    INFORMIX迁移到ORACLE

    3. **查询分页**:INFORMIX和Oracle的分页查询方式可能不同,Informix可能使用游标,Oracle通常使用ROWNUM配合子查询实现分页。 4. **索引与约束**:检查并转换Informix的索引和约束到Oracle的相应结构,如唯一性...

    Java 通用分页

    例如,SQL中的`LIMIT`和`OFFSET`在MySQL中用于分页,而在Oracle中可能使用`ROWNUM`。 二、Java分页实现方式 1. 手动编写SQL:直接在SQL语句中嵌入分页参数,如`SELECT * FROM table LIMIT offset, limit`。这种方式...

    oracle常见面试题.docx

    5. 分页查询:SQL Server中用TOP,Oracle中用ROWNUM或分析函数ROW_NUMBER。例如: - SQL Server:`SELECT TOP 20, n.* FROM tablename n MINUS SELECT TOP 10, m.* FROM tablename m` - Oracle:`SELECT * FROM ...

    Oracle到mysql转换的问题总结[收集].pdf

    - `NUMBER(p,s)`在Oracle中用于存储浮点数,而MySQL中对应的类型是`DECIMAL(p,s)`或`NUMERIC(p,s)`,它们都用于存储精确数值。 - `VARCHAR2`在Oracle中用于存储可变长度的字符数据,MySQL中的相应类型是`VARCHAR`...

    Oracle到mysql转换的问题总结.docx

    - `VARCHAR2`在Oracle中用于存储可变长度的字符数据,而在MySQL中,对应的类型是`VARCHAR`。 - `DATE`在Oracle中表示日期和时间,但在MySQL中,可以使用`DATE`(仅日期)或`DATETIME`(日期和时间)。 2. **SQL...

    Oracle到mysql转换的问题总结.doc

    - `VARCHAR2`在Oracle中用于存储可变长度的字符数据,MySQL中相应的是`VARCHAR`。 - `DATE`在Oracle中包含时间信息,MySQL中也有`DATE`类型,但通常配合`TIME`或`DATETIME`使用,后者包含日期和时间。 2. **语句...

    Oracle到mysql转换的问题总结要点.doc

    2. **SQL语句写法差异**: - Oracle中字符串用单引号包围,而MySQL中可用单引号或双引号。 - MySQL在使用子查询时,如`FROM (SELECT...)`,需要在子查询后添加别名。 - 在删除数据时,MySQL不支持对表使用别名,...

    分页代码演示

    SQL语句中的`LIMIT`和`OFFSET`子句在MySQL中用来实现这个功能,而在其他数据库系统中,如Oracle,可能使用`ROWNUM`或者`FETCH NEXT`。 3. **数据处理**:查询到的数据需要进行分割,以适应每页显示的数量。在Java中...

    java面试题综合

    26. 分页实现方式:如Limit分页、RowNum分页、物理分页等。 27. 多表操作:在Hibernate中使用SessionFactory的openSession和Transaction,进行批处理。 28. 用户、角色、权限关系:通常采用三表设计,用户表、角色...

Global site tag (gtag.js) - Google Analytics