设为首页收藏本站

融智技术学院

 找回密码
 注册

QQ登录

只需一步,快速开始

Andriod编程宝典
搜索
查看: 489|回复: 0

【数据库每日一问】oracle中SELECT TOP 10记录

[复制链接]
MrLi 发表于 2014-2-27 16:00:02 | 显示全部楼层 |阅读模式

问:在oracle的SQL语句中我遇到一个很大的问题,我要根据STORAGE_DB排序,并选择前10条记录,选择的内容是其他select语句列表
这一个是可以正常运行的:
  1. SELECT  DISTINCT  
  2.   APP_ID ,  
  3.   NAME ,  
  4.   STORAGE_GB ,  
  5.   HISTORY_CREATED ,  
  6.   TO_CHAR ( HISTORY_DATE ,  'DD.MM.YYYY' )  AS HISTORY_DATE  
  7.    FROM HISTORY WHERE  
  8.       STORAGE_GB IS  NOT  NULL  AND  
  9.         APP_ID NOT  IN  ( SELECT APP_ID
  10.                         FROM HISTORY
  11.                          WHERE TO_CHAR ( HISTORY_DATE ,  'DD.MM.YYYY' )  =  '06.02.2009' )
复制代码
但是,当我加入
  1. and  ROWNUM <=  10
  2. ORDER  BY STORAGE_GB DESC
复制代码

我得到的是一些“随机”记录。我想错误的地方是排序之前的限制条件。
是否有人有一个好的解决办法?另一个问题:这个查询是相当慢(超过一万条记录)。
答:
你需要把当前查询放到一个子查询中,如下所示:
  1. SELECT  *  FROM  (
  2.   SELECT  DISTINCT  
  3.   APP_ID ,  
  4.   NAME ,  
  5.   STORAGE_GB ,  
  6.   HISTORY_CREATED ,  
  7.   TO_CHAR ( HISTORY_DATE ,  'DD.MM.YYYY' )  AS HISTORY_DATE  
  8.    FROM HISTORY WHERE  
  9.     STORAGE_GB IS  NOT  NULL  AND  
  10.       APP_ID NOT  IN  ( SELECT APP_ID FROM HISTORY WHERE TO_CHAR ( HISTORY_DATE ,  'DD.MM.YYYY' )  = '06.02.2009' )
  11.   ORDER  BY STORAGE_GB DESC  )
  12. WHERE ROWNUM <=  10
复制代码
oracle适用ROWNUM来显示已经返回的结果。
记录返回之后,可以筛选结果,所以子查询是很有不要的。您还可以使用RANK()函数来获取前n个结果。 出于性能方面的因素可以使用NOT EXISTS替代NOT IN。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

融智技术联盟QQ群
融智技术Oracle群0
融智技术Oracle群1
融智技术Oracle群2
我有QQ群,我要加盟

小黑屋|手机版|Archiver|融智技术学院 ( 京ICP备09018999号  

GMT+8, 2018-11-21 22:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表