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

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 7
    Points : 2
    Points
    2
    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 expérimenté 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
    Points : 1 738
    Points
    1 738
    Par défaut
    il vous faudra passer par une jointure externe pour cela

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    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
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    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.
    Merci d'ajouter un sur les tags qui vous ont aidé

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 7
    Points : 2
    Points
    2
    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

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

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    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
    Merci d'ajouter un sur les tags qui vous ont aidé

  7. #7
    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
    Points : 13 092
    Points
    13 092
    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...

  8. #8
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci de votre réponse.
    Il est vrai que je n'ai rien dit là-dessus.
    En effet l'id du moteur et forcement différent de l'id de la voiture ou d'une pièce...
    En gros les ID ressemblent à ca:
    ID voiture: voiture_1
    ID moteur: moteur_1
    ID piece: piece_1

    Le problème ne vient donc pas de là.
    Merci de votre réponse

  9. #9
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Apparement, UNION n'est pas supporté par MS-SQL car j'obtiens le message d'erreur suivant:
    "The Query Designer does not support the UNION SQL construct."

    Et j'obtiens aussi une erreur en passant par php...

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

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Si UNION, n'est pas supporté par MS-SQL alors je mange mes semelles
    Merci d'ajouter un sur les tags qui vous ont aidé

  11. #11
    Membre habitué Avatar de tfc3146
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2009
    Messages : 79
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par kriskadespe Voir le message
    Apparement, UNION n'est pas supporté par MS-SQL car j'obtiens le message d'erreur suivant:
    "The Query Designer does not support the UNION SQL construct."

    Et j'obtiens aussi une erreur en passant par php...
    UNION est supporté par tous les SGBD dignes de ce nom
    C'est en faisant n'importe quoi qu'on devient n'importe qui
    Si un message vous a aidé, n'hésitez pas à mettre +1

  12. #12
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ok je viens de vérifier. En effet UNION et supporté par MS-SQL.
    L'erreur affichée ne concernait que l’éditeur de requêtes...

    Et je pense pouvoir me debrouiller avec UNION....
    Je passe le sujet en resolu.

    Merci à vous tous.

  13. #13
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par tfc3146 Voir le message
    UNION est supporté par tous les SGBD dignes de ce nom
    Et même par des SGBD pas toujours dignes de ce nom ...
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  14. #14
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    En l’occurrence, il me semble qu'un UNION ALL serait même possible et éviterait au sgbd un travail inutile de dédoublonnage, puisque a priori, il ne peut y avoir de doublon (à moins d'avoir des doublons dans les tables elles-même, mais c'est alors un autre problème)

+ 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