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

SQL Oracle Discussion :

bouclage dans une requête SQL aec jointure


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 344
    Points : 104
    Points
    104
    Par défaut bouclage dans une requête SQL aec jointure
    bonjour,
    voici ce que je souhaiterais faire

    Soit une Table "ENFANTS" comme ceci :
    NOM / AGE
    TOTO / 13
    LOLO / 14
    TITI / 15
    MUMU / 17

    Et une table "COPAINS" regroupant les X meilleurs copains des enfants, comme ceci :
    NOM / NUMERO / COPAIN
    TOTO / 1 / LOLO
    TOTO / 2 / NINI
    TOTO / 3 / CUCU
    MUMU / 1 / FIFI
    MUMU / 2 / TITI
    MUMU / 3 / LALA

    je souhaite joindre ces deux tables et faire en sorte d'obtenir ce genre de résultat (jointure sur le champ NOM)
    NOM / AGE / COP1 / COP2 / COP3
    TOTO / 13 / LOLO / NINI / CUCU
    MUMU / 17 / FIFI / TITI / LALA

    Ma difficulté est que les champs à créer de type COP* sont sur des enregistrements différents dans la table COPAINS, il faut donc que j'arrive à boucler mais je ne sais pas comment faire.

    De plus il faut rester en jointure type externe pour bien garder tous les ENFANTS, même ceux qui n'ont pas de copains

    Actuellement j'arrive à le faire mais pour cela je fais 3 jointures (1 par NUMERO de copain) ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select A.NOM, A.AGE, X.COPAIN as COP1, Y.COPAIN as COP2, Z.COPAIN as COP3
    from ENFANTS A
    left outer join COPAINS X on (X.NOM = A.NOM and X.NUMERO = 1)
    left outer join COPAINS Y on (Y.NOM = A.NOM and Y.NUMERO = 2)
    left outer join COPAINS Z on (Z.NOM = A.NOM and Z.NUMERO = 3)

    ...mais j'aimerais simplifier


    c'est un peu concon comme exemple mais j' espère c'est clair

    si vous avez une idée...

    merci
    laurent

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Ca va être dur de simplifier, SQL n'est pas trop fait pour la mise en forme des résultats (tu cherches à transformer des lignes en colonnes) ...
    La solution que tu proposes est la seule qui me semble viable, à condition toutefois que tous les enfant ont chacun 3 copains. Si le nombre de copains est variable en fonction de chaque enfant, il n'y pas de solution. A moins de déterminer un nombre de copains max, et d'en faire autant de jointures externes avec autant d'instances de la table COPAINS. Mais c'est un peu lourd-dingue, si le max du nombre de copains est de 30 ou 40... Et encore, jusqu'au jour où un enfant dépassera le nombre max de copains...

    Un intervenant du forum appelle cela régulièrement de la cosmétique, et te renvoie systématiquement à des liens vers des outils dédiés à l'enrobage des résultats. Je pense qu'il ne devrait plus tarder à sévir...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 344
    Points : 104
    Points
    104
    Par défaut
    Merci de ta réponse, dans mon cas bien sur, seuls les 3 premiers copains m'intéressent.

    Je procède ainsi pour ne pas avoir mon nombre d'enregistrement de triplé

    cdlt
    laurent

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 344
    Points : 104
    Points
    104
    Par défaut
    Et pour clarifier le truc, dans la réalité, ce ne sont pas des copains mais une zone de texte ou chaque ligne correspond à un numéro, sachant que les données qui m'intéressent sont généralement sur les 3 premières lignes de texte, je me limite à 3

    cdlt
    laurent

  5. #5
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    bon je sais pas si ça va aider mais si tu veux seulement 3 copains tu peux faire un truc comme ça (à adapter ...):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT enf,
               MAX(DECODE(seq,1,pote,null)) cop1,
               MAX(DECODE(seq,2,pote,null)) cop2,
               MAX(DECODE(seq,3,pote,null)) cop3
    FROM
           (SELECT e.nom enf, c.nom pote, row_number() over(partition by c.nom order by ??)
            FROM enfants e LEFT JOIN copains c ON e.nom = c.nom
           ) 
    WHERE seq <=3
    GROUP BY enf

Discussions similaires

  1. [MySQL] Erreur dans une requête sql
    Par Goundy dans le forum PHP & Base de données
    Réponses: 37
    Dernier message: 30/01/2006, 16h08
  2. [SQL] Récupérer des variables de formulaire dans une requête SQL
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/11/2005, 18h44
  3. Plusieurs jointures dans une requête sql
    Par Pero dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 20h59
  4. Nom de champ variable dans une requête SQL
    Par stip dans le forum ASP
    Réponses: 2
    Dernier message: 30/09/2004, 18h02
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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