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.