Oracle 查询前10条记录
Oracle 查询前10条记录
这个问题已经有了答案::
我在Oracle中的SQL语句中遇到了一个大问题。我想选择按照STORAGE_DB排序的前10条记录,这些记录不在另一个选择语句的列表中。
这个语句对所有记录都有效:
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+个记录)。
admin 更改状态以发布 2023年5月21日
如果你在使用Oracle 12c版本,请使用:
FETCH NEXT N 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
你需要将当前查询作为子查询放入下面的语法中:
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
。欲了解更多信息可访问此处。