Problem:
Du vil forbinde tabeller på flere kolonner ved at bruge en primær sammensat nøgle i én tabel og en fremmed sammensat nøgle i en anden.
Eksempel:
Vores database har tre tabeller med navnet student
, enrollment
og payment
. student
tabellen har data i følgende kolonner:id
(primær nøgle), first_name
og last_name
.
id | fornavn | efternavn |
---|---|---|
1 | Ellie | Willson |
2 | Tom | Brun |
3 | Sandra | Møller |
enrollment
tabellen har data i følgende kolonner:primærnøgle (student_id
og course_code
), is_active
og start_date
.
student_id | kursuskode | er_aktiv | startdato |
---|---|---|---|
1 | GD03 | sandt | 2020-01-20 |
1 | AP01 | falsk | 2020-03-10 |
2 | SL01 | sandt | 2020-05-05 |
3 | SL01 | sandt | 2020-06-01 |
payment
tabellen har data i følgende kolonner:fremmednøgle (student_id
og course_code
, de primære nøgler til enrollment
tabel), status
og amount
.
student_id | kursuskode | status | beløb |
---|---|---|---|
1 | GD03 | betalt | 230 |
1 | AP01 | afventer | 100 |
2 | SL01 | afventer | 80 |
3 | SL01 | afventer | 110 |
Lad os vise hver elevs navn, kursuskode og betalingsstatus og beløb.
Løsning:
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;
efternavn | fornavn | kursuskode | status | beløb |
---|---|---|---|---|
Willson | Ellie | GD03 | betalt | 230 |
Willson | Ellie | AP01 | afventer | 100 |
Brun | Tom | SL01 | afventer | 80 |
Møller | Sandra | SL01 | afventer | 110 |
Diskussion:
Hvis du gerne vil have data gemt i tabeller sammenføjet af en sammensat nøgle, der er en primær nøgle i én tabel og en fremmednøgle i en anden tabel, skal du blot bruge en joinbetingelse på flere kolonner.
I én samlet tabel (i vores eksempel, enrollment
), har vi en primær nøgle bygget af to kolonner (student_id
og course_code
). I den anden tabel (payment
), har vi kolonner, der er en fremmed sammensat nøgle (student_id
og course_code
). Hvordan kan vi samle tabellerne med disse sammensatte nøgler?
Let! Vi skal bare bruge en JOIN
klausul med mere end én betingelse ved at bruge AND-operatoren efter den første betingelse. I vores eksempel bruger vi denne betingelse:
p.course_code=e.course_code AND p.student_id=e.student_id
I den første del bruger vi student_id
kolonne fra enrollment
tabel og student_id
fra payment
bord. I den næste tilstand får vi course_code
kolonne fra enrollment
tabel og course_code
fra payment
tabel.
Bemærk, at student_id
og course_code
kolonner danner en primær nøgle i enrollment
bord. Derfor bruges de i payment
tabel som en fremmednøgle.