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.