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

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

Barbara Streisand
Libérer: 2025-01-18 15:31:16
original
501 Les gens l'ont consulté

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

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

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

(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!

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