在oracle的sql语句中,根据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。