Précédent   Forum du club des développeurs et IT Pro > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/11/2012, 23h30   #1
Fxg
Membre éprouvé
 
Inscription : septembre 2003
Messages : 400
Détails du profil
Informations personnelles :
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2003
Messages : 400
Points : 430
Points : 430
Par défaut Jointures sur plusieurs tables

Bonjour

Pour simplifier, j'ai dans ma base trois tables :
Livres (num_livre, titre, num_auteur, num_dessinateur, num_coloriste, num_genre)
Auteurs (num_auteur, nom, prenom, ecrit, dessine, colorie)
Genres (num_genre, genre)

ecrit, dessine et colorie servent à identifier si un auteur est un écrivain et/ou un dessinateur et/ou un coloriste.

J'aimerais (simplement) pouvoir afficher :
titre, nom, prenom genre

J'ai écrit la requête suivante :

Code :
1
2
3
4
SELECT LIVRES.titre, AUTEURS.prenom || ' ' || AUTEURS.nom
FROM LIVRES 
INNER JOIN AUTEURS ON LIVRES.num_auteur=AUTEURS.num_auteur
ORDER BY LIVRES.titre
mais je n'arrive pas à intégrer les jointures sur num_dessinateur, num_coloriste et num_genre.

Sans doute du à mon niveau débutant en SQl, mais aussi peut-être à une erreur de conception dans mon modèle.

Merci
Fxg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 07h46   #2
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 217
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2007
Messages : 4 217
Points : 7 284
Points : 7 284
Bonjour,

Je ne suis pas sur de vraiment répondre à la demande .
Si pour un Livre on a
- Un Auteur
- Un Dessinateur
- Un Coloriste

Alors, en utilisant des Alias pour les tables

Code :
1
2
3
4
5
6
7
8
9
10
SELECT L.titre, A.prenom || ' ' || A.nom AS Auteur,
           D.prenom || ' ' || D.nom AS Dessinateur,
           C.prenom || ' ' || C.nom AS Coloriste,
           G.Genre
FROM LIVRES L
INNER JOIN AUTEURS A ON L.num_auteur=A.num_auteur
INNER JOIN AUTEURS D ON L.num_dessinateur=D.num_auteur
INNER JOIN AUTEURS C ON L.num_coloriste=C.num_auteur
INNER JOIN GENRES G ON L.Num_genre=G.Num_genre
ORDER BY LIVRES.titre
on aura la réponse souhaitée

Maintenant si un livre n'a par exemple pas de Coloriste [NULL] , il n'apparaitra pas dans la liste a cause du INNER JOIN . Si à la place de INNER on met un LEFT , alors on obtiendras une liste de tous les livres , que les 'intervenants' (auteur,dessinateur,coloriste) soient indiqués ou non .

un bon petit tutoriel sur les jointures
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 08h54   #3
dehorter olivier
Membre Expert
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 921
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 : 921
Points : 1 241
Points : 1 241
il me semble qu'ajouter une table serait plus judicieux:

Type_Auteurs (num_auteur, Type_Auteurs)
Type_auteurs contenant : ecrit, dessine et colorie

et revoir la table Livres afin d'en éliminer les "auteurs" pour réaliser une table des auteurs d'un livre (il peut avoir plusieurs auteurs par livre, non ?)
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 10h56   #4
Fxg
Membre éprouvé
 
Inscription : septembre 2003
Messages : 400
Détails du profil
Informations personnelles :
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2003
Messages : 400
Points : 430
Points : 430
@ Olivier : C'est un projet purement personnel. Dans le schéma il est prévu un auteur et un coauteur. Sinon je renseigne auteur à Collectif et le détail sera fait dans un champ commentaire.

@ Sergio : pour le tuto je l'avais bien évidemment imprimé et parcouru ainsi que d'autres, mais ce qui me pertubait était le fait que num_auteur, num_coloriste et num_dessinateur de la table LIVRES renvoient à AUTEURS.Num_auteur
Pour la différence entre INNER, LEFT et RIGHT j'aivais intégré et remplacé mon INNER par un LEFT plus juste dans mon cas.

je vais tester avec les alias et j'espère mettre un tag Résiolu. Merci
Fxg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 11h38   #5
Fxg
Membre éprouvé
 
Inscription : septembre 2003
Messages : 400
Détails du profil
Informations personnelles :
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2003
Messages : 400
Points : 430
Points : 430
Merci cela correspond bien au résultat que je voulais.

Quelques remarques :
Après le ORDER il faut L.titre et pas LIVRES.titre

plus sérieusement, est ce qu'il y a surtout en terme de performance une limitation sur le nombre de jointures que je peux utiliser.
et je ne vois pas bien l'intérêt de passer par une table "intermédiaire" type_Auteurs.

Merci encore
Fxg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 11h55   #6
dehorter olivier
Membre Expert
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 921
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 : 921
Points : 1 241
Points : 1 241
Citation:
Envoyé par Fxg Voir le message
plus sérieusement, est ce qu'il y a surtout en terme de performance une limitation sur le nombre de jointures que je peux utiliser.
Non
Citation:
Envoyé par Fxg Voir le message
et je ne vois pas bien l'intérêt de passer par une table "intermédiaire" type_Auteurs.
Cela respecte plus les normes dans la construction des bases de données. Imagines que vous devez ajouter une nouvelle catégorie d'auteurs par ex les peintres... vous devrez ajouter une nouvelle colonne, ce qui n'est pas du tout le cas avec une TABLE "intermédiaire" type_Auteurs.
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 14h34   #7
Fxg
Membre éprouvé
 
Inscription : septembre 2003
Messages : 400
Détails du profil
Informations personnelles :
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2003
Messages : 400
Points : 430
Points : 430
Merci cela est beaucoup plus clair.

Mais si je rajoute une nouvelle catégorie "d'auteurs" il faudra aussi que je rajoute un nouveau champ dans ma table LIVRES par exemple num_peintre ou il y a t il une autre possibilité sur ce cas (simple)
Fxg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 14h48   #8
dehorter olivier
Membre Expert
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 921
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 : 921
Points : 1 241
Points : 1 241
Citation:
Envoyé par Fxg Voir le message
Merci cela est beaucoup plus clair.

Mais si je rajoute une nouvelle catégorie "d'auteurs" il faudra aussi que je rajoute un nouveau champ dans ma table LIVRES par exemple num_peintre ou il y a t il une autre possibilité sur ce cas (simple)
non il suffit d'une colonne supplémentaire 'type_oeuvre' par exemple
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 17h03   #9
Fxg
Membre éprouvé
 
Inscription : septembre 2003
Messages : 400
Détails du profil
Informations personnelles :
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : septembre 2003
Messages : 400
Points : 430
Points : 430
Merci à tous les deux et à bientôt pour sans doute d'autres questions ici où sur le forum Delphi
Fxg est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h26.


 
 
 
 
Partenaires

Hébergement Web