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

Langage SQL Discussion :

Jointure sur plusieurs tables


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut Jointure sur plusieurs tables
    bonjour a tous,

    j ai 3 tables
    avec les enregistrments suivants


    codesandwich
    idsandwich libellesandwich
    1 saumon
    2 thon
    3 crudite


    codeajout
    idajout libelleajout
    1 tomate
    2 oeuf
    3 fromage


    commandes
    idcommande idsandwich codeajout1 codeajout2 codeajout3 codeajout4
    1 1 1 2
    2 3 2
    3 1 1 3
    4 2 1 2 3


    je cherche a afficher les resultats sous forme de libellé
    idcommande idsandwich codeajout1 codeajout2 codeajout3 codeajout4
    1 saumon tomate oeuf
    2 crudite oeuf
    3 saumon tomate fromage
    4 thon tomate oeuf fromage

    je passe par une requete avec des jointures externes mais je n obtient le bon libellé que pour le codeajout1, ensuite il le repete sur tous les autres codeajout

    merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Pour que l'on puisse t'aider à corriger ta requête, il serait peut-être utile que tu nous la montre...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut
    je ne suis pas devant mon code mais de memoire j'ai ce type de requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select c.idsandwich, s.libellesandwich, c.codeajout1, a.libelleajout, c.codeajout2, a.libelleajout, c.codeajout3, a.libelleajout
    from commandes c
    left outer join codesandwich s
    on c.idsandwich = s.idsandwich
    left outer join codeajout a
    on c.codeajout1 = a.codeajout
    or
    c.codeajout2 = a.codeajout
    or
    c.codeajout3 = a.codeajout

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    C'est bien ce que je pensais...
    Il faut faire autant de jointures qu'il y a de colonnes codeajoutn
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut
    ok je vais essayer
    et je vous tiens au courant pour marquer comme resolue ou pas


    merci

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut
    bonjour,

    j ai essayé avec autant de jointure que de codeajout(n) mais cela ne marche pas.

    si quelqu un a une idée pour la realisation de ce genre de requete.
    peut etre avec des sous-requetes?

    de plus j ai essayé d ajouter une clause group by, mais la syntaxe est en erreur!?

    merci a tous

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par cdsoft Voir le message
    j ai essayé avec autant de jointure que de codeajout(n) mais cela ne marche pas.
    Encore une fois, sans voir ton code ni connaître le résultat erroné ou le message d'erreur, il est très difficile de te donner des réponses.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut
    bonsoir,

    j ai quelque peu changé ma structure relationnelle mais cela ne change pas grand chose a mon probleme.
    voici les tables et ma requete, qui ne me retournent pas les resultats attendus



    codesandwich
    idcodesandwich libellesandwich
    1 saumon
    2 thon
    3 crudite


    codeajout
    idcodeajout libelleajout
    1 tomate
    2 oeuf
    3 fromage

    sandwich
    idsandwich codesandwich codeajout1 codeajout2 codeajout3 qte
    1 3 3 1 2
    2 1 3 2 1

    commandes
    idcommandes nom date idsanwich
    1 toto 20181117 1
    2 tata 20181118 2

    je cherche a afficher les resultats sous forme de libellé
    sandwich
    nom qte libelle sandwich libelleajout1 libelleajout2 libelleajout3
    toto 2 crudite fromage tomate
    tata 1 saumon fromage oeuf


    voici ma requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT codesandwich.libelle,codeajout.libelle,Commandesclient.nomclient,Commandesclient.qte 
    FROM Commandesclient 
    LEFT OUTER JOIN  sandwich 
    ON  Commandesclient.IDsandwich = sandwich.IDsandwich 
     
    LEFT OUTER JOIN codesandwich ON codesandwich.IDcodesandwich = sandwich.codesandwich
    LEFT OUTER JOIN codeajout ON codeajout.IDcodeajout = sandwich.codeajout1
    mais je ne parviens pas a ajouter les autres libellés correspondants aux codeajout2 et codeajout3

    merci

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Il faut faire autant de jointures qu'il y a de colonnes codeajoutn
    Qu'est-ce que tu ne comprends pas dans cette phrase ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    SELECT  csw.libelle
        ,   aj1.libelle
        ,   aj2.libelle
        ,   aj3.libelle
        ,   cmd.nomclient
        ,   cmd.qte 
    FROM    Commandesclient AS  cmd
        LEFT OUTER JOIN  
            sandwich        AS  sdw
            ON  cmd.IDsandwich = sdw.IDsandwich 
       LEFT OUTER JOIN 
            codesandwich    AS  csw        
            ON  csw.IDcodesandwich = sdw.codesandwich
        LEFT OUTER JOIN
            codeajout       AS  aj1
            ON  aj1.IDcodeajout = sdw.codeajout1
        LEFT OUTER JOIN
            codeajout       AS  aj2
            ON  aj2.IDcodeajout = sdw.codeajout2
        LEFT OUTER JOIN
            codeajout       AS  aj3
            ON  aj3.IDcodeajout = sdw.codeajout3
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut
    merci

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par cdsoft Voir le message
    bonsoir,

    j ai quelque peu changé ma structure relationnelle mais cela ne change pas grand chose a mon probleme.
    voici les tables et ma requete, qui ne me retournent pas les resultats attendussandwich
    idsandwich codesandwich codeajout1 codeajout2 codeajout3 qte
    1 3 3 1 2
    2 1 3 2 1
    Puisque vous avez la possibilité de modifier la structure de vos tables, profitez en pour revoir la table sandwish (que je renomme composer ci-dessous) en supprimant la répétition des colonnes "codeajout"

    La table telle que vous l'avez modélisée ne respecte pas les formes normales. Du coup vous avez prévu au max 3 types d'ajouts ("composant" ou "ingrédient" serait un terme bien plus adapté que "ajout") ce qui vous obligera à modifier la table le jour un un sandwish aura besoin d'un 4ème composant. Et pour les sandwish qui n'ont que deux composants, il y a une colonne inutile marquée à "null"

    De plus, la quantité est unique pour tous les ingrédients, c'est aberrant

    La table "composer" est issue de la relation entre ce que vous avez appelé "codesandwish" et "codeajout"
    Les règles de gestion sont probablement
    R001 : un sandwish est composé d'au moins un ingrédient
    R002 : un ingrédient peut composer zéro à plusieurs sandwish

    Les tables devraient être décrites comme suit (PK soulignées) :

    Sandwish_SA (SA_id, SA_code, SA_libelle)
    Ingredient_IN(IN_id, IN_code, IN_Libelle, IN_unite_mesure_qte)
    Composer_CO(SA_id, IN_id, CO_Qte)

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

Discussions similaires

  1. Problème de jointure sur plusieurs tables
    Par papouuu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/01/2011, 14h02
  2. [AC-2007] Jointure sur plusieurs tables
    Par Steph0 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 20/01/2011, 08h24
  3. jointure sur plusieurs tables fonctionne pas
    Par jmsch dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/11/2010, 21h55
  4. Jointures sur plusieurs tables
    Par Daibai dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/12/2009, 09h55
  5. hibernate-criteria : jointure sur plusieurs tables
    Par loic72 dans le forum Hibernate
    Réponses: 9
    Dernier message: 24/09/2007, 17h27

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