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

如何通过过滤高效选出Oracle中前10条记录?

Barbara Streisand
Barbara Streisand原创
2025-01-18 15:31:16504浏览

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

Oracle数据库中高效筛选前10条记录:子查询和ROWNUM技术

本文旨在解决从HISTORY表中按STORAGE_GB排序,并排除符合特定条件的行,最终只选择前10条记录的问题。直接使用ROWNUM限制结果在排序之前会导致问题。

使用子查询的解决方案:

解决方案是创建一个子查询,根据所有条件(包括排序顺序)选择所需的记录。然后,使用该子查询作为数据源,利用ROWNUM选择前10行。

<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进行优化:

对于大型数据集,Oracle的ROWNUM效率不高。考虑使用EXISTS运算符代替NOT IN以提高性能。

<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 NOT EXISTS (
    SELECT 1
    FROM HISTORY
    WHERE
      APP_ID = APP_ID
      AND TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009'
  )
ORDER BY STORAGE_GB DESC
FETCH FIRST 10 ROWS ONLY;</code>

(注意:LIMIT 10 在Oracle中不被直接支持,应使用 FETCH FIRST 10 ROWS ONLY替代)

通过以上方法,可以高效地从Oracle数据库中筛选出符合条件的前10条记录。 选择使用EXISTS的版本可以显着提升查询效率,尤其是在处理大型数据集时。

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

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