Problem:
Du vill sammanfoga tabeller i flera kolumner genom att använda en primär sammansatt nyckel i en tabell och en främmande sammansatt nyckel i en annan.
Exempel:
Vår databas har tre tabeller som heter student
, enrollment
och payment
. student
tabellen har data i följande kolumner:id
(primär nyckel), first_name
och last_name
.
id | förnamn | efternamn |
---|---|---|
1 | Ellie | Willson |
2 | Tom | Brun |
3 | Sandra | Miller |
enrollment
tabellen har data i följande kolumner:primärnyckel (student_id
och course_code
), is_active
och start_date
.
student_id | kurskod | är_aktiv | startdatum |
---|---|---|---|
1 | GD03 | sant | 2020-01-20 |
1 | AP01 | falskt | 2020-03-10 |
2 | SL01 | sant | 2020-05-05 |
3 | SL01 | sant | 2020-06-01 |
payment
tabellen har data i följande kolumner:främmande nyckel (student_id
och course_code
, de primära nycklarna för enrollment
tabell), status
och amount
.
student_id | kurskod | status | belopp |
---|---|---|---|
1 | GD03 | betald | 230 |
1 | AP01 | väntande | 100 |
2 | SL01 | väntande | 80 |
3 | SL01 | väntande | 110 |
Låt oss visa varje elevs namn, kurskod och betalningsstatus och belopp.
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;
efternamn | förnamn | kurskod | status | belopp |
---|---|---|---|---|
Willson | Ellie | GD03 | betald | 230 |
Willson | Ellie | AP01 | väntande | 100 |
Brun | Tom | SL01 | väntande | 80 |
Miller | Sandra | SL01 | väntande | 110 |
Diskussion:
Om du vill få data lagrade i tabeller sammanfogade av en sammansatt nyckel som är en primärnyckel i en tabell och en främmande nyckel i en annan tabell, använd helt enkelt ett sammanfogningsvillkor på flera kolumner.
I en sammanfogad tabell (i vårt exempel, enrollment
), har vi en primärnyckel byggd av två kolumner (student_id
och course_code
). I den andra tabellen (payment
), har vi kolumner som är en främmande sammansatt nyckel (student_id
och course_code
). Hur kan vi slå samman tabellerna med dessa sammansatta nycklar?
Lätt! Vi behöver bara använda en JOIN
sats med mer än ett villkor genom att använda AND-operatorn efter det första villkoret. I vårt exempel använder vi detta villkor:
p.course_code=e.course_code AND p.student_id=e.student_id
I den första delen använder vi student_id
kolumnen från enrollment
tabell och student_id
från payment
tabell. I nästa tillstånd får vi course_code
kolumnen från enrollment
tabell och course_code
från payment
bord.
Observera att student_id
och course_code
kolumner bildar en primärnyckel i enrollment
tabell. Därför används de i payment
tabell som en främmande nyckel.