Maison > base de données > tutoriel mysql > Comment sélectionner efficacement les 10 principaux enregistrements dans Oracle avec filtrage et classement ?

Comment sélectionner efficacement les 10 principaux enregistrements dans Oracle avec filtrage et classement ?

Linda Hamilton
Libérer: 2025-01-18 15:42:11
original
166 Les gens l'ont consulté

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

Sélection des 10 meilleurs enregistrements Oracle : filtrage, classement et optimisation

Récupérer les dix premiers enregistrements dans Oracle est généralement simple, mais l'ajout de filtres et la priorisation des performances présentent des défis. Une récente question Stack Overflow l'a souligné, en se concentrant sur la sélection des dix premiers enregistrements en fonction d'une colonne spécifique tout en excluant les enregistrements répondant à une certaine condition.

La requête originale et ses lacunes

La requête SQL initiale visait à sélectionner des enregistrements uniques en fonction de plusieurs critères : capacité de stockage non nulle, exclusion des enregistrements d'une date précise et ordre décroissant par capacité de stockage. Cependant, la requête n'a pas réussi à limiter correctement les résultats aux dix premiers.

<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>
Copier après la connexion

Ajouter simplement ROWNUM <= 10 à cette requête ne produirait pas le top 10 correct car ROWNUM est attribué avant que la clause ORDER BY soit traitée.

La solution : une approche de sous-requête

La solution efficace utilisait une sous-requête pour appliquer correctement le filtrage et le classement :

<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>
Copier après la connexion

Cette structure imbriquée garantit que les enregistrements sont classés en premier, puis les dix premiers sont sélectionnés.

Améliorations des performances

Au-delà de la correction de commande, l'utilisation de EXISTS au lieu de NOT IN améliore considérablement les performances. EXISTS offre généralement de meilleures opportunités d'optimisation, minimisant les jointures et améliorant la vitesse d'exécution des requêtes.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal