sql - Oracle SELECT 前 10 条记录

标签 sql oracle top-n

我在 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/

相关文章:

sql - 使用 T-SQL 查询 Active Directory

java.sql.SQLSyntaxErrorException : ORA-02289: sequence does not exist while using default Generation Strategy in Hibernate with Oracle

java - 既然 Oracle 停用了 Suns 下载站点,我应该在哪里下载适用于 Linux 的 javacomm?

oracle - 访问 ID 列表时的 Top N 查询性能

mysql - 计算移动平均 MySQL?

mysql - 需要从日期起每 60 天标记一次

SQL 查询 - 多列合并为一列

oracle - 如何访问 PL/SQL 存储过程的 AST(抽象语法树)?

r - dplyr - 如何筛选出销售额更多(总和)的前 n 个组?

Oracle 11g - top N order by 很慢