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中文网其他相关文章!