Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/08/2011, 15h09   #1
Invité de passage
 
Inscription : juillet 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 7
Points : 0
Points : 0
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 :
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
kriskadespe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h13   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h16   #3
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 085
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 085
Points : 1 883
Points : 1 883
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h19   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
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.
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h20   #5
Invité de passage
 
Inscription : juillet 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 7
Points : 0
Points : 0
@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
kriskadespe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h31   #6
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
en utilisant le UNION

Code :
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
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h57   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h59   #8
Invité de passage
 
Inscription : juillet 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 7
Points : 0
Points : 0
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
kriskadespe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 16h04   #9
Invité de passage
 
Inscription : juillet 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 7
Points : 0
Points : 0
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...
kriskadespe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 16h19   #10
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Si UNION, n'est pas supporté par MS-SQL alors je mange mes semelles
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 16h22   #11
Membre habitué
 
Avatar de tfc3146
 
Homme Robert Labrousse
Développeur décisionnel
Inscription : février 2009
Messages : 79
Détails du profil
Informations personnelles :
Nom : Homme Robert Labrousse
Localisation : France

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

Informations forums :
Inscription : février 2009
Messages : 79
Points : 134
Points : 134
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
__________________
Citation:
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
tfc3146 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 16h26   #12
Invité de passage
 
Inscription : juillet 2009
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 7
Points : 0
Points : 0
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.
kriskadespe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 16h29   #13
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 11h46   #14
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h01.


 
 
 
 
Partenaires

Hébergement Web