IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Oracle Discussion :

[ORACLE] besoin d'aide sur une requête distinct + order by


Sujet :

Oracle

  1. #1
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut [ORACLE] besoin d'aide sur une requête distinct + order by
    Bonjour à tous


    j'ai la table "table" suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     -----------------------
    |  a   |   b   |    c   |
     -----------------------
    |  1   |   1   |    A   |
    |  2   |   5   |    C   |
    |  3   |   7   |    B   |
    |  4   |   2   |    B   |
    |  5   |   9   |    A   |
    |  6   |   3   |    E   |
    |  7   |   6   |    D   |
     -----------------------
    je voudrais récupérer les 5 premières lignes, triées par 'a' descendant , et 'b' descendant.

    jusque là ça va :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a,b,c
    FROM ma_table
    where rownum <= 5
    ORDER BY a DESC, b DESC
    retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     -----------------------
    |  a   |   b   |    c   |
     -----------------------
    |  7   |   6   |   D    |
    |  6   |   3   |   E    |
    |  5   |   9   |   A    |
    |  4   |   2   |   B    |
    |  3   |   7   |   B    |
     -----------------------

    Mais maintenant je voudrais que la requête ne retourne que les valeurs de c différentes :
    en gros je ne voudrais pas voir la dernière ligne car la valeur b est déjà présente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     -----------------------
    |  a   |   b   |    c   |
     -----------------------
    |  7   |   6   |   D    |
    |  6   |   3   |   E    |
    |  5   |   9   |   A    |
    |  4   |   2   |   B    |
    |  2   |   5   |   C    |
     -----------------------
    j'ai bien tenté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a,b,distinct(c)
    FROM ma_table
    where rownum <= 5
    ORDER BY a DESC, b DESC

    mais ça ne marche pas.

    Quelqu'un aurait une idée ?

    merci

    PoichOU

  2. #2
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Le ORDER BY doit etre dans une sous-requete ET sourtout PAS au meme niveau que le ROWNUM.
    Voir dans le lien ci-dessous une quantite de solutions differentes :
    http://www.oracle.com/technology/ora...o56asktom.html

    Quant au DISTINCT(c), desole, j'ai rien compris a ce que tu veux.

    Nicolas.

  3. #3
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut
    bonjour NGasparotto

    a priori ce n'est pas le ORDER BY et le ROWNUM qui pose problème mais plutôt le distinct.

    la 1ère requête fonctionne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a,b,c
    FROM ma_table
    where rownum <= 5
    ORDER BY a DESC, b DESC
    pour le distinct l'idée est de ne pas avoir 2 fois la même valeur c dans le retour de la requête. La 1ère requête retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     -----------------------
    |  a   |   b   |    c   |
     -----------------------
    |  7   |   6   |   D    |
    |  6   |   3   |   E    |
    |  5   |   9   |   A    |
    |  4   |   2   |   B    |
    |  3   |   7   |   B    |
     -----------------------
    on peut voir qu'il y a 2 fois la valeur B (les 2 dernières lignes de résultat)


    si je rajoute un distinct, j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error: ORA-01791: not a SELECTed expression
    As-tu une idée ?

  4. #4
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Si, le ORDER BY doit etre dans une sous requete si tu veux avoir les memes results a chaque fois.

    Bon, alors voila ce que je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT a,b,c
    FROM (select a,
                 b,
                 c,
                 row_number() over (partition by c order by a DESC, b DESC) rn_c
          from ma_table
          order by a DESC, b DESC)
    WHERE rn_c = 1
    and   rownum <= 5
    ORDER BY a DESC, b DESC;
    Maintenant, il faudra te documenter...

    Nicolas.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par PoichOU Voir le message
    a priori ce n'est pas le ORDER BY et le ROWNUM qui pose problème mais plutôt le distinct.
    Lis ceci avant de dire qu'il n'y a pas de problème à priori : http://oracle.developpez.com/faq/?page=3-1#rownum

    Citation Envoyé par PoichOU Voir le message
    on peut voir qu'il y a 2 fois la valeur B (les 2 dernières lignes de résultat)
    si je rajoute un distinct, j'ai l'erreur :
    Ben oui, le distinct sur un champ ne marche pas sur un seul champ.

    Que veux-tu précisément comme résultat pour le champ c = 'B' qui retourne deux valeurs ?

  6. #6
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par NGasparotto Voir le message
    Bon, alors voila ce que je propose...
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select *
    from   (SELECT max(a) keep (dense_rank first order by a desc, b desc) a,
                   max(b) keep (dense_rank first order by a desc, b desc) b,
                   c
            FROM   ma_table
            group by c
            ORDER BY a DESC, b DESC)
    where rownum<=5
    ORDER BY a DESC, b DESC;
    Bon, en fait il y a de nultiples solutions, prends celle qui te convient le mieux, tout du moins celle que tu comprends.
    Mais encore une fois, pour limiter les resultats avec ROWNUM, tu dois d'abord trier, ce qui veut dire un ORDER BY dans une sous-requete.

    Nicolas.

  7. #7
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut
    Merci à vous 2 pour ces infos, je vais tester ces requêtes (et surtout essayer de les comprendre) !

    Logique finalement pour le ROWNUM et le ORDER BY mais j'étais très loin d'y penser ...

    merci pour le coup de main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Besoin d'aide sur une requête
    Par moonboot dans le forum Oracle
    Réponses: 1
    Dernier message: 01/08/2006, 15h56
  2. besoin d'aide sur une requête mysql
    Par unmulot dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/07/2006, 13h17
  3. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26
  4. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  5. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29

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