Oracle 查询前10条记录

21 浏览
0 Comments

Oracle 查询前10条记录

这个问题已经有了答案:

如何限制在Oracle查询后排序返回的行数?

我在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日
0
0 Comments

如果你在使用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

0
0 Comments

你需要将当前查询作为子查询放入下面的语法中:

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。欲了解更多信息可访问此处

0