题
我有在甲骨文的SQL语句的大问题。我想选择的TOP 10条下令STORAGE_DB这不是从其他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
我得到了某种“随机”记录。我想是因为限订单之前发生在地方。
是否有人有一个很好的解决方案?另一个问题:该查询是真的慢(10K +记录)
解决方案
您将需要把你的当前查询的子查询,如下:
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
甲骨文适用 ROWNUM 以所述结果已经返回后它。点击你需要过滤结果已经返回后,因此需要一个子查询。您也可以使用 RANK()函数为了获得高端-N结果。
搜索结果
出于性能方面的尝试在地方NOT EXISTS
使用NOT IN
。见此了解。
其他提示
如果使用的是Oracle 12c中,使用:
FETCH NEXT的 Ñ 强> ROWS ONLY
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
FETCH NEXT 10 ROWS ONLY
更多信息: http://docs.oracle.com/javadb /10.5.3.0/ref/rrefsqljoffsetfetch.html
至于表现不佳有任何数量的事情可能是,它真的应该是一个单独的问题。然而,存在可能是一个问题的一种显而易见的事:
WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009')
如果HISTORY_DATE真的是一个日期栏,如果它有一个索引然后这个重写将执行更好:
WHERE HISTORY_DATE = TO_DATE ('06.02.2009', 'DD.MM.YYYY')
这是因为一个数据类型转换禁止使用B树索引的。
试
SELECT * FROM users FETCH NEXT 10 ROWS ONLY;
您因为ORDER BY之前应用ROWNUM得到一个明显的随机集。所以,你的查询需要前十行和排序them.0要选择前十的工资,你应该在子查询中使用的解析函数,然后过滤器:
select * from
(select empno,
ename,
sal,
row_number() over(order by sal desc nulls last) rnm
from emp)
where rnm<=10
不隶属于 StackOverflow