问:在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。