Probleem:
U wilt tabellen op meerdere kolommen samenvoegen door een primaire samengestelde sleutel in de ene tabel en een externe samengestelde sleutel in een andere te gebruiken.
Voorbeeld:
Onze database heeft drie tabellen met de naam student
, enrollment
, en payment
. De student
tabel bevat gegevens in de volgende kolommen:id
(primaire sleutel), first_name
, en last_name
.
id | voornaam | achternaam |
---|---|---|
1 | Ellie | Willson |
2 | Tom | Bruin |
3 | Sandra | Miller |
De enrollment
tabel bevat gegevens in de volgende kolommen:primaire sleutel (student_id
en course_code
), is_active
, en start_date
.
student_id | course_code | is_actief | startdatum |
---|---|---|---|
1 | GD03 | waar | 2020-01-20 |
1 | AP01 | false | 2020-03-10 |
2 | SL01 | waar | 05-05-2020 |
3 | SL01 | waar | 2020-06-01 |
De payment
tabel bevat gegevens in de volgende kolommen:refererende sleutel (student_id
en course_code
, de primaire sleutels van de enrollment
tabel), status
, en amount
.
student_id | course_code | status | bedrag |
---|---|---|---|
1 | GD03 | betaald | 230 |
1 | AP01 | in behandeling | 100 |
2 | SL01 | in behandeling | 80 |
3 | SL01 | in behandeling | 110 |
Laten we de naam, cursuscode en betalingsstatus en het bedrag van elke student tonen.
Oplossing:
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;
achternaam | voornaam | course_code | status | bedrag |
---|---|---|---|---|
Willson | Ellie | GD03 | betaald | 230 |
Willson | Ellie | AP01 | in behandeling | 100 |
Bruin | Tom | SL01 | in behandeling | 80 |
Miller | Sandra | SL01 | in behandeling | 110 |
Discussie:
Als u gegevens wilt opslaan in tabellen die zijn samengevoegd door een samengestelde sleutel die een primaire sleutel is in de ene tabel en een externe sleutel in een andere tabel, gebruikt u gewoon een join-voorwaarde voor meerdere kolommen.
In één samengevoegde tabel (in ons voorbeeld enrollment
), hebben we een primaire sleutel opgebouwd uit twee kolommen (student_id
en course_code
). In de tweede tabel (payment
), hebben we kolommen die een buitenlandse samengestelde sleutel zijn (student_id
en course_code
). Hoe kunnen we de tabellen samenvoegen met deze samengestelde sleutels?
Eenvoudig! We hoeven alleen een JOIN
. te gebruiken clausule met meer dan één voorwaarde door de operator AND te gebruiken na de eerste voorwaarde. In ons voorbeeld gebruiken we deze voorwaarde:
p.course_code=e.course_code AND p.student_id=e.student_id
In het eerste deel gebruiken we de student_id
kolom uit de enrollment
tabel en student_id
van de payment
tafel. In de volgende voorwaarde krijgen we de course_code
kolom uit de enrollment
tabel en course_code
van de payment
tafel.
Merk op dat de student_id
en course_code
kolommen vormen een primaire sleutel in de enrollment
tafel. Daarom worden ze gebruikt bij de payment
tabel als een externe sleutel.