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 :

Double jointure et relation 1..n


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 28
    Points
    28
    Par défaut Double jointure et relation 1..n
    Bonjour,

    J'ai les deux tables suivantes

    Produit (id, nom, comp1, comp2)
    id | nom | comp1*| comp2
    ------------------------------
    1 prod1 1 2

    Comp (id, order, nom)

    id | order | nom
    ------------------------
    1 1 comp1_1
    1 2 comp1_2
    2 1 comp2_1
    2 2 comp2_2
    2 3 comp2_3
    J'aimerais à partir de çà avoir le résultat suivant:
    prod1 comp1_1 comp2_1
    prod1 comp1_2 comp2_2
    prod1 null comp2_3


    Le problème vient du fait que la liste issue de comp1 et celle de comp2 n'ont pas forcément la même taille.

    Est-il possible d'écrire un requête donnant ce résultat ?

    Merci pour votre aide.

  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 789
    Points
    30 789
    Par défaut
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  prd.nom
        ,   cp1.nom
        ,   cp2.nom
    FROM    produit AS prd
        LEFT JOIN
            comp    AS cp1
            ON  prd.comp1 = cp1.id
        LEFT JOIN
            comp    AS cp2
            ON  prd.comp2 = cp2.id
    ;
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Merci pour ta réponse. Mais avec cette requête j'ai quelque chose comme çà
    prod1 | comp1_1 | comp2_1
    prod1 | comp1_1 | comp2_2
    prod1 | comp1_1 | comp2_3
    prod1 | comp1_2 | comp2_1
    prod1 | comp1_2 | comp2_2
    prod1 | comp1_2 | comp2_3

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    J'ai également essayé quelque chose comme çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT  prd.nom, cp1.nom, cp2.nom
    FROM    produit AS prd
    LEFT JOIN comp AS cp1 ON  prd.comp1 = cp1.id
    LEFT JOIN comp AS cp2 ON  (prd.comp2 = cp2.id and cp1.order = cp2.order
    çà marche bien quand la liste comp1 est plus longue que celle de comp2, mais évidemment pas dans le sens inverse.

    Peut-être est-il possible de s'en sortir avec un seconde requête et un UNION ?

  5. #5
    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 789
    Points
    30 789
    Par défaut
    Si je comprends bien ta demande, tu souhaites ne pas afficher le contenu associé à la colonne comp1 ou comp2 si cette valeur apparit à la ligne précédente...

    1. Sans clause ORDER BY, tu n'es pas assuré de l'ordre des lignes retournée par la requête
    2. Ce besoin tient de la mise en forme de l'affichage, qui n'est pas du ressort de la requête SQL mais de l'application...
    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.

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Ton SGBD ?

    Sous MySQL, tu peux faire de la cosmétique avec GROUP CONCAT.
    Sinon, avec du récursif. (Sous Oracle par exemple, tu dois pouvoir faire ça assez facilement avec CONNECT BY et SYS_CONNECT_BY_PATH)

    [EDIT] En relisant, j'ai peut être mal compris ce que tu veux.
    Enfin d'un autre côté, ça serait bien si tu pouvais énoncer une règle précise pour ton problème

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

Discussions similaires

  1. Double jointure gauche retourne mauvais résultats
    Par the_mechant dans le forum JDBC
    Réponses: 3
    Dernier message: 24/12/2007, 12h07
  2. Double jointure, léger problème.
    Par SiM07 dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/12/2006, 16h12
  3. requete avec double jointure externe
    Par cdu dans le forum Langage SQL
    Réponses: 8
    Dernier message: 04/01/2006, 14h54
  4. Doubles jointures externes....
    Par HPJ dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/11/2004, 15h28
  5. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03

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