`
ah_fu
  • 浏览: 224012 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Oracle中的rownum与Order By之间的关系

阅读更多

    刚学ORACLE的时候,就先入为主地认为rownum是一种类似于SQLSERVER的TOP关键字一样的机制————起码咱们最常用的分页可以用这个搞定。
    事实并非如此,学习的时候,“空”是很重要的,以前的经验往往是一种坏处。
    SQLSERVER中,如果TOP关键字和ORDER BY关键字一起出现,是先ORDER BY 后再TOP。也就是说:取得最前面的几条记录是经过排序的。
   而ORACLE中,如果使用WHERE rownum<=N和ORDER BY一起出现的话,ROWNUM优先于ORDER BY。也就是说,ORDER BY无法对所有满足条件的记录排序,只能对当前的rownum<=N中的N条记录排序。
   看下面这个分页的查询:
SELECT LimitResult.*
FROM
(
    SELECT *, rownum AS r
    FROM ATable
    WHERE rownum<=40
    ORDER BY createTime DESC
) LimitResult
WHERE LimitResult.r>20
--每页20条,取第二页

   查询的结果中,仅仅只是对当前页的CreateTime进行了倒序排列,并没有按照所有记录的倒序排列。说明rownum的限制优先于ORDER BY。不得已把查询修改成下面的样子:
SELECT LimitResult.*
FROM
(
 SELECT OrderResult.*, rownum AS r
 FROM
 (
        SELECT *
        FROM ATable
        ORDER BY createTime DESC
 ) OrderResult
 WHERE rownum<=40
) LimitResult
WHERE LimitResult.r>20
明显效率没有以前高了,但是没办法。

    以上就是我发现的规律,希望朋友们能提出更好的办法。谢谢!

分享到:
评论

相关推荐

    oracle中rownum和row_number()

    一、oracle中rownum 用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。 1、rownum 对于

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    Oracle查询中rownum与Order by查询 45 oracle9i小结 46 Oracle 数据库的聚簇技术 61 数据库、服务名、实例 63 Oracle内存结构 64 sys用户和system用户 67 Oracle SQL语句 67 GROUPING SETS分组 74 Oracle外部程序...

    oracle与SQL server的语法差异总结

    Oracle与SQL Server应用差异对比分析在Oracle中采用伪列rownum 获取结果集中排在前面的部分记录 Eg: 返回结果集中前10条记录 Select * from sysc01 where rownum Rownum可使用&lt;、符号,不可使用&gt;、&gt;=符号,如果使用...

    Oracle数据库学习指南

    37. 如何在oracle7和oracle8之间exp-imp数据 38. 如何在Windows 2000下将Oracle完全卸载 39. 如何正确建立TYPE、partition(分区) 40. 如何正确利用Rownum来限制查询所返回的行数 41. 什么是ROWID,为什么需要...

    mysql,sqlserver,oracle取前10条数据.docx

    这种方法与 mysql 中的 limit 语句类似,但是 sqlserver 中的 top 语句可以与 order by 语句结合使用,例如: ```sql select top 10 * from table1 order by id desc; ``` 这将取出 table1 中的前 10 条数据,并且...

    Oracle中使用伪列rownum实现分页查询

    伪列rownum rownum是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数 ...select * from emp order by sal desc ) where rownum&lt;=3 结果如下: 原创文章 4获赞 4访问量 62 关注 私信

    java笔记\Oracle里sql不能用limit的处理

    SELECT *, ROW_NUMBER() OVER (ORDER BY MyKey) AS RN FROM TableA ) WHERE RN &gt; 100 AND RN ; ``` 五、总结 在Oracle中,我们可以使用RowNum函数、Minus运算符、Subquery和Top-N查询来实现分页查询。这些方法...

    Oracle 9i与MS SQL Server 2000之比较

    在SQL Server中可以用top n 来返回指定数量的纪录,Oracle中与之对应的是 rownum,只 是不同的是:SQL Server的top n 是逻辑顺序返回的纪录,而Oracle的 rownum 指定的是物理顺 序的序号,其物理的序号是在order by之前就...

    oracle常见面试题及答案

    `SELECT * FROM (SELECT * FROM 表 ORDER BY 列名 DESC) WHERE ROWNUM * FROM (SELECT * FROM 表 ORDER BY 列名 DESC) WHERE ROWNUM ;` 这些问题涵盖了 Oracle 的基础知识、存储过程、索引、约束、查询等方面,是 ...

    在ORACLE中SELECT TOP N的实现方法

     由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。  简单地说,实现方法如下所示: SELECT 列名1...列名n FROM (SELECT 列名1...列名n...

    Oracle练习.txt

    ORDER BY column; 15. 如何在给现有的日期加上2年? select add_months(sysdate,24) from dual; 16.Connect string是指什么? 应该是tnsnames.ora中的服务名后面的内容 17.返回大于等于N的最小整数值? SELECT CEIL(-...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    从就业与择业的角度来讲,计算机相关专业的大学生从事oracle方面的技术是职业发展中的最佳选择。 其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的...

    Oracle数据库、SQL

    5.4 order by后面可以跟什么 10 5.5多列排序 10 六、 单行函数的使用 11 6.1数值类型 11 6.2日期类型 11 6.3字符类型 13 6.4转换函数 14 6.5其他注意事项 14 七、 SQL语句中的分支 15 7.1分支表达式 15 7.2分支函数 ...

    史上最全Oracle数据库基本操作练习题(含答案).docx

    * 使用ORDER BY子句对数据进行排序,如SELECT * FROM emp ORDER BY ename; 五、多表关联和子查询 * 使用FROM子句关联多个表,如SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno; * 使用子查询进行数据查询,...

    Oracle创建视图(View)

    2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用ORDER BY 子句; 3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn; 4.OR REPLACE选项可以不删除原视图便可更改其定义并...

    Oracle与Mysql主键、索引及分页的区别小结

    3、分页, mysql: select * from user order by desc limit n ,m. 表示,从第n条数据开始查找,一共查找m条数据。 Oracle:select * from user select rownum a * from ((select * from user)a) select * from ...

    select分页查询1

    SELECT emp.*, ROW_NUMBER() OVER (ORDER BY empno) AS rn FROM emp ) WHERE rn ; ``` 使用子查询 子查询是 Oracle 数据库中的一种常用的查询方式,可以用来实现分页查询。例如,以下查询将返回 EMP 表中的第 5 ...

    根据时间拆分记录的方法

    WITH t2 AS (SELECT ROWNUM-1 rn FROM dual CONNECT BY ROWNUM(SELECT MAX( ceil(months_between(e_date,s_date)))+1 FROM URP_WAGE.T_WAGE_BASE_ITEM_BKYM)) SELECT employee_id,year_month, Add_months(s_date,...

    Oracle事例

    20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); &lt;2&gt; 对第1个字段...

    Oracle 随机数

    利用oracle的dbms_random包结合rownum来实现,示例如下,随机取499户: select * from ( select * from busi.t_ar_userinfo order by dbms_random.value) where rownum &lt; 500; 有关dbms_random的参考文献,链接...

Global site tag (gtag.js) - Google Analytics