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 :

Problème avec les jointures multiples


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 7
    Par défaut Problème avec les jointures multiples
    Bonjour,
    Ça fait maintenant plusieurs heures que je me prends la tête pour écrire une requête SQL utilisant de multiples jointures.
    Voici le design de ma base de données:

    _VOITURE___________PIECE_______________MOTEUR
    +--------+_______+-----------+_______+----------------+
    |.ID........|_______|.ID............|_______|.ID...................|
    |.Couleur.|_______|.Parent_ID..|_______|.Parent_ID.........|
    +--------+_______|.Name........|_______|.Type...............|
    ________________+-----------+_______+----------------+

    Évidemment, une voiture est composée de pièces et de moteur (au moins un).
    Le moteur est composé de pièces également.

    Mon objectif: Ecrire une requête SQL me permettant de récupérer une table sous cette forme:

    ____VOITURE.ID_____MOTEUR.ID_______PIECE.NAME
    +----------------+----------------+--------------------+
    |...........1..........|.......NULL..........|.....Allume.cigare......|
    |...........1..........|.......NULL..........|.....Phare.droit.........|
    |...........1..........|.......NULL..........|.....Phare.gauche......|
    |...........1..........|..........1............|.........Piston.1.........|
    |...........1..........|..........1............|.........Piston.2.........|
    |...........1..........|..........1............|.........Carter...........|
    |...........1..........| ..........1............|.........Bielle.............|
    |...........2...........|.......NULL.........|........Allume.cigare....|
    |...........2...........|.......NULL.........|.........Phare.droit......|
    +----------------+----------------+--------------------+

    J'ai essayé avec des INNER JOIN mais sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT VOITURE.ID, MOTEUR.ID, PIECE.NAME
    FROM VOITURE
    INNER JOIN MOTEUR ON MOTEUR.Parent_ID = VOITURE.ID
    INNER JOIN PIECE AS PIECE1 ON PIECE1.Parent_ID = VOITURE.ID
    INNER JOIN PIECE AS PIECE2 ON PIECE2.Parent_ID = MOTEUR.ID
    Il n'y a aucune valeur null dans le champ MOTEUR.ID.

    Si vous avez des idées.....???

    Merci

  2. #2
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    il vous faudra passer par une jointure externe pour cela

    Bon courage

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 448
    Par défaut
    Bonjour,
    La clause SELECT n'est pas bonne non plus car la table PIECE a un alias (en fait 2) dans la clause FROM.

    Tatayo.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 7
    Par défaut
    @tatayo
    Dans ce cas il faudrait que je fasse deux colonnes dans mon select.
    Il y a pas un moyen de les joindres?

    @Yanika_bzh
    Si je passe par une jointure externe, j'aurais aussi toutes les entrées de MOTEUR sans pouvoir limiter avec un WHERE VOITURE.ID = '1'

    Merci pour votre rapidité et vos réponses

  5. #5
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    en utilisant le UNION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT Voiture.Id,
           Moteur.Id,
           Piece.Name
      FROM Voiture
        INNER JOIN Moteur ON Moteur.Parent_id = Voiture.Id
        INNER JOIN Piece ON Piece.Parent_id = Moteur.Id
    union 
    SELECT Voiture.Id,
           NULL,
           Piece.Name
      FROM Voiture
        INNER JOIN Piece  ON Piece.Parent_id = Voiture.Id

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour


    Heu... vous semblez avoir un énorme problème de modélisation

    Qu'est-ce qui vous permet de savoir que pour une pièce donnée ayant par exemple parent_ID = 3, il s'agit d'une pièce de la voiture ayant l'ID 3 ou d'une pièce du moteur ayant l'ID 3 ???

    quelque chose m’échappe !

    A moins que vous n'ayez une règle afin qu'une valeur d'ID pour une voiture ne puisse servir d'ID pour un moteur et vice versa... mais... je reste perplexe !

    Je crois qu'une petite explication/révision de votre modèle s'impose...

  7. #7
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    absolument

    et attention aux noms des tables si on utilise des ALIAS.


    dans la clause SELECT il y est noté la table PIECE qui, virtuellement, n'existe plus.

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

Discussions similaires

  1. [MySQL] Problème avec les jointures
    Par Akim13 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/05/2011, 16h02
  2. Problème avec les jointures
    Par xoum89 dans le forum Langage SQL
    Réponses: 16
    Dernier message: 28/03/2011, 21h41
  3. Problème avec les jointures
    Par exqo77 dans le forum JDBC
    Réponses: 6
    Dernier message: 17/02/2010, 10h06
  4. [MySQL] Problème avec les jointure pour un menu
    Par Glocman dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/07/2006, 17h44
  5. Réponses: 2
    Dernier message: 21/07/2005, 12h05

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