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.