首页 >数据库 >mysql教程 >如何通过过滤和排序高效选择Oracle中的前10条记录?

如何通过过滤和排序高效选择Oracle中的前10条记录?

Linda Hamilton
Linda Hamilton原创
2025-01-18 15:42:11170浏览

How to Efficiently Select the Top 10 Records in Oracle with Filtering and Ordering?

Oracle 前 10 条记录选择:过滤、排序和优化

在 Oracle 中检索前十条记录通常很简单,但添加过滤器和确定性能优先级会带来挑战。最近的一个 Stack Overflow 问题强调了这一点,重点是根据特定列选择前十条记录,同时排除满足特定条件的记录。

原始查询及其缺点

最初的 SQL 查询旨在根据几个条件选择唯一记录:非空存储容量、排除特定日期的记录以及按存储容量降序排列。 然而,查询未能正确地将结果限制为前十名。

<code class="language-sql">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') </code>

仅将 ROWNUM <= 10 添加到此查询不会生成正确的前 10 条,因为 ROWNUM 是在 处理 子句之前分配的。ORDER BY

解决方案:子查询方法

有效的解决方案采用子查询来正确应用过滤和排序:

<code class="language-sql">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</code>
这种嵌套结构确保记录

首先排序,然后选择前十个。

性能改进

除了顺序更正之外,使用

代替 EXISTS 还可以显着提高性能。 NOT IN 通常提供更好的优化机会,最大限度地减少连接并提高查询执行速度。EXISTS

以上是如何通过过滤和排序高效选择Oracle中的前10条记录?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn