我在 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
我收到了某种“随机”记录。我认为是因为限制是在订单之前发生的。
有人有好的解决办法吗?另一个问题:这个查询真的很慢(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
Oracle申请rownum返回后的结果。
返回后需要对结果进行过滤,所以需要子查询。您还可以使用RANK()函数来获取 Top-N 结果。
为了提高性能,请尝试使用 NOT EXISTS
代替 NOT IN
。请参阅this了解更多。
关于sql - Oracle SELECT 前 10 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2498035/