Oracle怎样查询表中的top10条记录呢?

  select *

  from test

  where rownum <=10

  下面是关于rownum的介绍

  ================================

  Rownum和row_number() over()的使用

  ROWNUM是Oracle从8开始提供的一个伪列,是把SQL出来的结果进行编号,始终从1开始,常见的用途就是用来分页输出.

  比如

  SELECT *

  FROM torderdetail a

  WHERE ROWNUM <= 10

  这条语句就是输出前10条纪录,在这里用途上类似于sql sever的top,不过rownum对于指定编号区间的输出应该说更强大

  SELECT *

  FROM (SELECT a.*, ROWNUM rn

  FROM torderdetail a)

  WHERE rn >= 10 AND rn <= 20

  这条语句即是输出第10到第20条纪录,这里之所以用rownum rn,是把rownum转成实例,因为rownum本身只能用 <=的比较方式,只有转成实列,这样就可做 >=的比较了。

  在实际用途中,常常会要求取最近的几条纪录,这就需要先对纪录进行排序后再取rownum <=

  一般常见的

  SELECT *

  FROM (SELECT a.*

  FROM torderdetail a

  ORDER BY order_date DESC)

  WHERE ROWNUM <= 10

  而在CSDN曾经发生过讨论,关于取近的10条纪录,有人给出这样的语句

  SELECT a.*

  FROM torderdetail a

  WHERE ROWNUM <= 10

  ORDER BY order_date DESC

  之所以会出现这样的语句,主要是从效率上的考虑,前面条语句,是要进行全表扫描后再排序,然后再取10条纪录,后一条语句则不会全表扫描,只会取出10条纪录,很明显后条语句的效率会高许多。

  那为什么会有争议呢,那就在于在执行顺序上争议,是先执行排序取10条纪录,还是取10条纪录,再排序呢?两种顺序取出来的结果是截然相反的, 先排序再取10条,就是取最近的10条,而先取10条,再排序,则取出的最早的10条纪录。对于此语句,普遍的认为执行顺序是先取10条纪录再排序的。所 以此语句应该是错误。但实际上并非如此,此语句的执行顺序和order by的字段有关系,如果你order by 的字段是pk,则是先排序,再取10条(速度比第一种语句快),而排序字段不是PK 时,是先取10条再排序,此时结果就与要求不一样了,所以第二种写法一定要在排序字段是主键的情况下才能保证结果正确。

  Row_number() over()这个分析函数是从9I开始提供的,一般的用途和rownum差不多。

  一般写法row_number() over( order by order_date desc) 生成的顺序和rownum的语句一样,效率也一样(对于同样有order by 的rownum语句来说),所以在这种情况下两种用法是一样的。

  而对于分组后取最近的10条纪录,则是rownum无法实现的,这时只有row_number可以实现,row_number() over(partition by 分组字段 order by 排序字段)就能实现分组后编号,比如说要取近一个月的每天最后10个订单纪录

  SELECT *

  FROM (SELECT a.*,

  ROW_NUMBER () OVER (PARTITION BY TRUNC (order_date) ORDER BY order_date DESC)

  rn

  FROM torderdetail a)

  WHERE rn <= 10

  Rownum的另类用法,有时候我们会遇到这种需求,要求输出当月的所有天数,许多人会烦恼,数据库里又没有这样的表,怎么输出一个月的所有天数呢?用rownum就能解决:

  SELECT TRUNC (SYSDATE, 'MM') + ROWNUM - 1

  FROM DUAL

  CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))

http://soft.chinabyte.com/database/27/11420027.shtml

最新文章

  1. PHP 返回JSON
  2. ajax携带状态值
  3. 给img添加类名可以动态切换图片
  4. Android使用ZXing生成带图片的二维码
  5. 甚是挂念学校的acmer
  6. hihocoder 1163 博弈游戏&#183;Nim游戏
  7. ASP.NET获取根目录的方法集合
  8. hmac_sha1 签名
  9. [分享]源代码&开发手记:SAE应用“车百科” (Python + SAE + Bottle + Bootstrap) - Bottle - Python4cn(news, jobs)
  10. C++数据结构之图
  11. mount挂接命令使用
  12. video 属性和事件用法大全
  13. UOJ#346. 【清华集训2017】某位歌姬的故事 动态规划
  14. 安装FrameWork后重新注册IIS
  15. vuex-Mutation(同步)
  16. Python2.7-weakref
  17. hdu 5046 二分+DLX模板
  18. Webapi上传数据(XML)敏感字符解决方案
  19. yii的一些方法的解析和blog的详细解析
  20. Meter and pixel units in a box2d game - LibGDX

热门文章

  1. python----特性003
  2. 基于stm32f103zet6的FAT16文件系统学习0(读SD卡扇区)
  3. Dropbox 用什么语言开发的?(Python在各个平台都是全能的,特别是有PyObjC真没想到)
  4. Swift是一个提供RESTful HTTP接口的对象存储系统
  5. 认识元数据和IL(下)&lt;第五篇&gt;
  6. 转:Dynamic Binding Of RDLC To ReportViewer
  7. 2013长沙网络赛H题Hypersphere (蛋疼的题目 神似邀请赛A题)
  8. 转化率最高的16个WordPress 电子商务主题
  9. SSR分子标记
  10. DOTween 模仿NGUI Tween