1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2018
    Messages
    81
    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 : 81
    Points : 39
    Points
    39

    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 681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 681
    Points : 5 211
    Points
    5 211

    Par défaut

    order by CLT_NUMERO desc dans la sous requête.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2018
    Messages
    81
    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 : 81
    Points : 39
    Points
    39

    Par défaut

    Merci

  4. #4
    Membre éclairé
    Homme Profil pro
    DBA Oracle
    Inscrit en
    avril 2013
    Messages
    723
    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 : 723
    Points : 688
    Points
    688

    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
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2018
    Messages
    81
    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 : 81
    Points : 39
    Points
    39

    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 681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 681
    Points : 5 211
    Points
    5 211

    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 éclairé
    Homme Profil pro
    DBA Oracle
    Inscrit en
    avril 2013
    Messages
    723
    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 : 723
    Points : 688
    Points
    688

    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
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 665
    Points : 16 492
    Points
    16 492

    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 éclairé
    Homme Profil pro
    DBA Oracle
    Inscrit en
    avril 2013
    Messages
    723
    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 : 723
    Points : 688
    Points
    688

    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: 24/04/2016, 23h20
  2. Réponses: 3
    Dernier message: 20/02/2014, 15h34
  3. Réponses: 0
    Dernier message: 02/06/2009, 15h03
  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, 21h03
  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, 19h17

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