Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2018
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 22
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2018
    Messages : 87
    Points : 43
    Points
    43

    Par défaut Requete pour extraire les 1000 derniers clients

    Bonjour à tous,

    Je dois extraire les 1000 derniers clients de ma BDD.

    j'ai tapé ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
      FROM (SELECT * FROM tbl_name )
    WHERE ROWNUM < 1001;
    Après dans ma table j'ai une colonne CLT_NUMERO

    Comment faire pour dire : dans la colonne CLT_numero je veux les 1000 derniers numéro ? merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    août 2008
    Messages
    2 720
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 720
    Points : 5 297
    Points
    5 297

    Par défaut

    order by CLT_NUMERO desc dans la sous requête.

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2018
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 22
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2018
    Messages : 87
    Points : 43
    Points
    43

    Par défaut

    Merci

  4. #4
    Membre éprouvé
    Homme Profil pro
    DBA Oracle
    Inscrit en
    avril 2013
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DBA Oracle
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : avril 2013
    Messages : 935
    Points : 1 019
    Points
    1 019

    Par défaut

    Est-ce que ta colonne CLT_NUMERO est une séquence? Si oui, peux-tu faire
    WHERE CLT_NUMERO between (select max(CLT_NUMERO) -1000 from ta_table ) AND (select max(CLT_NUMERO) from ta_table ) ?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2018
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 22
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2018
    Messages : 87
    Points : 43
    Points
    43

    Par défaut

    Comme cela ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM (SELECT * FROM CLT)
    WHERE CLT_NUMERO between (select max(CLT_NUMERO ) -1000 from CLT) AND (select max(CLT_NUMERO ) CLT) ;
    Cela ne fonctionne pas :/

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    août 2008
    Messages
    2 720
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 720
    Points : 5 297
    Points
    5 297

    Par défaut

    Quelle drôle d'idée... une séquence ne garantit pas l'absence de trou.
    De toute façon que ce soit avec rownum ou row_number, les requêtes de type TOP N sont optimisées pour arrêter de scanner dès qu'on a le bon nombre de ligne.

  7. #7
    Membre éprouvé
    Homme Profil pro
    DBA Oracle
    Inscrit en
    avril 2013
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DBA Oracle
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : avril 2013
    Messages : 935
    Points : 1 019
    Points
    1 019

    Par défaut

    Citation Envoyé par Tsuazerty Voir le message
    Comme cela ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM (SELECT * FROM CLT)
    WHERE CLT_NUMERO between (select max(CLT_NUMERO ) -1000 from CLT) AND (select max(CLT_NUMERO ) CLT) ;
    Cela ne fonctionne pas :/
    Quel est le problème? Un message d'erreur ou bien tu ne récupères pas les 1000 enregs voulus?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  8. #8
    Modérateur

    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    7 701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 701
    Points : 16 055
    Points
    16 055

    Par défaut

    @Ikebukuro C'est pas terrible côté perf votre réponse, vous faites trois scans de tables.
    En plus la deuxième partie du between est vraiment inutile, un nombre sera toujours inférieur ou égal à son maximum non ?
    De surcroît il y manque un from.
    Vous vouliez probablement écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM CLT
     WHERE CLT_NUMERO >= (select max(CLT_NUMERO) - 1000 from CLT);
    Mais la solution de skuatamad aura de meilleure performances.

  9. #9
    Membre éprouvé
    Homme Profil pro
    DBA Oracle
    Inscrit en
    avril 2013
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DBA Oracle
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : avril 2013
    Messages : 935
    Points : 1 019
    Points
    1 019

    Par défaut

    Effectivement j'ai écrit un peu vite la requête, d'où l'absence du FROM...

    Concernant les perfs :
    1) tout dépend de la taille de la table, les 2 SELECTs que je fais en plus peuvent être très rapides, à moins que cette table des clients n'ait des millions de rows --> mais le deuxième SELECT est effectivement de trop
    2) dans la solution avec la sous-requête, on construit d'abord une vue temporaire avec l'intégralité de la table... on connait mieux en terme de perfs

    skuatamad, tu écris "De toute façon que ce soit avec rownum ou row_number, les requêtes de type TOP N sont optimisées pour arrêter de scanner dès qu'on a le bon nombre de ligne."
    Cela signifie que la sous-requête ne ramène que les 1000 enregs ou bien, comme je le crois, la sous-requête ramène toute la table PUIS on filtre le résultat pour ne garder que les 1000 enregs?
    Je penche pour la deuxième explication mais en terme de perfs je trouve cela mauvais mais vu que chez mon client beaucoup d'ordres sont écrits comme ça... peut-être que c'est moi qui ait tort.


    3) un ORDER BY a, dans "quasiment" tous les cas, un surcoût non négligeable

    Je me demande donc si notre solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM CLT WHERE CLT_NUMERO >= (select max(CLT_NUMERO) - 1000 from CLT);
    n'est pas plus rapide que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *  FROM (SELECT * FROM tbl_name order by CLT_NUMERO desc) WHERE ROWNUM < 1001;
    A tester avec un autotrace par exemple...
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

Discussions similaires

  1. Réponses: 17
    Dernier message: 25/04/2016, 00h20
  2. Réponses: 3
    Dernier message: 20/02/2014, 16h34
  3. Réponses: 0
    Dernier message: 02/06/2009, 16h03
  4. [REQUETE] Extraire les x premiers clients de chaque portefeuille
    Par Noirceuil dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 09/03/2007, 22h03
  5. Je ne trouve pas la requete pour modifier les entrées...
    Par guttts dans le forum Langage SQL
    Réponses: 7
    Dernier message: 24/08/2005, 20h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo