Sélection des 10 meilleurs enregistrements Oracle avec exclusion de date
Cet article aborde le défi courant des bases de données Oracle : récupérer les 10 premiers enregistrements classés par une colonne spécifique, tout en excluant simultanément les enregistrements correspondant à des critères spécifiques d'une autre table. Un simple SELECT DISTINCT
avec une clause ORDER BY
et ROWNUM
ne suffira pas en raison de l'interaction de ces éléments.
La solution utilise une sous-requête pour obtenir le résultat souhaité :
<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 NOT EXISTS ( SELECT 1 FROM HISTORY h2 WHERE h2.APP_ID = HISTORY.APP_ID AND TO_CHAR(h2.HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009' ) ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10;</code>
Cette approche filtre d'abord la table HISTORY
dans la requête interne. La clause NOT EXISTS
exclut efficacement les enregistrements où APP_ID
correspond aux enregistrements avec HISTORY_DATE
égal à « 06.02.2009 ». Les résultats sont ensuite classés par STORAGE_GB
(décroissant). La requête externe applique la contrainte ROWNUM <= 10
, garantissant que seuls les 10 premiers enregistrements sont renvoyés. Cette méthode applique correctement la limite de lignes après le filtrage et le classement, garantissant des résultats précis.
Remarque : NOT EXISTS
offre généralement de meilleures performances que NOT IN
pour ce type d'exclusion, en particulier avec des ensembles de données volumineux. Consultez la documentation Oracle pour d'autres stratégies d'optimisation des performances.
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!