Problème :
Vous souhaitez joindre des tables sur plusieurs colonnes en utilisant une clé composée primaire dans une table et une clé composée étrangère dans une autre.
Exemple :
Notre base de données comporte trois tables nommées student
, enrollment
, et payment
. L'student
la table contient des données dans les colonnes suivantes :id
(clé primaire), first_name
, et last_name
.
identifiant | prénom | nom_de_famille |
---|---|---|
1 | Élie | Willson |
2 | Tom | Marron |
3 | Sandra | Miller |
Le enrollment
la table contient des données dans les colonnes suivantes :clé primaire (student_id
et course_code
), is_active
, et start_date
.
identifiant_étudiant | code_cours | is_active | date_début |
---|---|---|---|
1 | GD03 | vrai | 2020-01-20 |
1 | AP01 | faux | 2020-03-10 |
2 | SL01 | vrai | 2020-05-05 |
3 | SL01 | vrai | 2020-06-01 |
Le payment
la table contient des données dans les colonnes suivantes :clé étrangère (student_id
et course_code
, les clés primaires de l'enrollment
tableau), status
, et amount
.
identifiant_étudiant | code_cours | statut | montant |
---|---|---|---|
1 | GD03 | payé | 230 |
1 | AP01 | en attente | 100 |
2 | SL01 | en attente | 80 |
3 | SL01 | en attente | 110 |
Montrons le nom de chaque étudiant, le code du cours, ainsi que l'état et le montant du paiement.
Solution :
SELECT s.last_name, s.first_name, p.course_code, p.status, p.amount FROM enrollment e JOIN student s ON s.id=e.student_id JOIN payment p ON p.course_code=e.course_code AND p.student_id=e.student_id;
nom_de_famille | prénom | code_cours | statut | montant |
---|---|---|---|---|
Willson | Élie | GD03 | payé | 230 |
Willson | Élie | AP01 | en attente | 100 |
Marron | Tom | SL01 | en attente | 80 |
Meunier | Sandra | SL01 | en attente | 110 |
Discussion :
Si vous souhaitez obtenir des données stockées dans des tables jointes par une clé composée qui est une clé primaire dans une table et une clé étrangère dans une autre table, utilisez simplement une condition de jointure sur plusieurs colonnes.
Dans une table jointe (dans notre exemple, enrollment
), nous avons une clé primaire construite à partir de deux colonnes (student_id
et course_code
). Dans le deuxième tableau (payment
), nous avons des colonnes qui sont une clé étrangère composée (student_id
et course_code
). Comment joindre les tables avec ces clés composées ?
Facile! Nous avons juste besoin d'utiliser un JOIN
clause avec plus d'une condition en utilisant l'opérateur AND après la première condition. Dans notre exemple, nous utilisons cette condition :
p.course_code=e.course_code AND p.student_id=e.student_id
Dans la première partie, nous utilisons le student_id
colonne du enrollment
table et student_id
du payment
table. Dans la condition suivante, nous obtenons le course_code
colonne du enrollment
tableau et course_code
du payment
tableau.
Notez que le student_id
et course_code
les colonnes forment une clé primaire dans le enrollment
table. Par conséquent, ils sont utilisés dans le payment
table comme clé étrangère.