ITPub博客

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

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

Oracle 作者:cjzyfx 时间:2014-02-28 19:29:58 0 删除 编辑

 

问:oracleSQL语句中我遇到一个很大的问题,我要根据STORAGE_DB排序,并选择前10条记录,选择的内容是其他select语句列表

这一个是可以正常运行的

  • SELECT  DISTINCT 
  •   APP_ID , 
  •   NAME , 
  •   STORAGE_GB , 
  •   HISTORY_CREATED , 
  •   TO_CHAR ( HISTORY_DATE ,  'DD.MM.YYYY' )  AS HISTORY_DATE 
  •    FROM HISTORY WHERE 
  •       STORAGE_GB IS  NOT  NULL  AND 
  •         APP_ID NOT  IN  ( SELECT APP_ID
  •                         FROM HISTORY
  •                          WHERE TO_CHAR ( HISTORY_DATE ,  'DD.MM.YYYY' )  =  '06.02.2009' )

但是,当我加入

  • and  ROWNUM <=  10
  • ORDER  BY STORAGE_GB DESC

我得到的是一些“随机”记录。我想错误的地方是排序之前的限制条件。

是否有人有一个好的解决办法?另一个问题:这个查询是相当慢(超过一万条记录)。

答:

你需要把当前查询放到一个子查询中,如下所示:

  • SELECT  *  FROM  (
  •   SELECT  DISTINCT 
  •   APP_ID , 
  •   NAME , 
  •   STORAGE_GB , 
  •   HISTORY_CREATED , 
  •   TO_CHAR ( HISTORY_DATE ,  'DD.MM.YYYY' )  AS HISTORY_DATE 
  •    FROM HISTORY WHERE 
  •     STORAGE_GB IS  NOT  NULL  AND 
  •       APP_ID NOT  IN  ( SELECT APP_ID FROM HISTORY WHERE TO_CHAR ( HISTORY_DATE ,  'DD.MM.YYYY' )  = '06.02.2009' )
  •   ORDER  BY STORAGE_GB DESC  )
  • WHERE ROWNUM <=  10

oracle适用ROWNUM来显示已经返回的结果。

记录返回之后,可以筛选结果,所以子查询是很有不要的。您还可以使用RANK()函数来获取前n个结果。 出于性能方面的因素可以使用NOT EXISTS替代NOT IN

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22610243/viewspace-1115202/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-09-27

最新文章