Filtrer efficacement les 10 premiers enregistrements de la base de données Oracle : sous-requête et technologie ROWNUM
Cet article vise à résoudre le problème du tri par STORAGE_GB de la table HISTORY, en excluant les lignes qui répondent à des conditions spécifiques, et en sélectionnant finalement uniquement les 10 premiers enregistrements. Utiliser directement ROWNUM pour limiter les résultats avant le tri peut poser des problèmes.
Solution utilisant une sous-requête :
La solution consiste à créer une sous-requête qui sélectionne les enregistrements requis en fonction de tous les critères, y compris l'ordre de tri. Ensuite, utilisez cette sous-requête comme source de données et utilisez ROWNUM pour sélectionner les 10 premières lignes.
<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>
Utilisez EXISTS pour l'optimisation :
Pour les grands ensembles de données, le ROWNUM d'Oracle n'est pas efficace. Pensez à utiliser l'opérateur EXISTS au lieu de NOT IN pour améliorer les performances.
<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>
(Remarque : LIMIT 10
n'est pas directement pris en charge dans Oracle, FETCH FIRST 10 ROWS ONLY
doit être utilisé à la place)
Grâce à la méthode ci-dessus, vous pouvez filtrer efficacement les 10 principaux enregistrements qui remplissent les conditions de la base de données Oracle. Choisir la version utilisant EXISTS
peut améliorer considérablement l'efficacité des requêtes, en particulier lors du traitement de grands ensembles de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!