Problema:
Vuoi unire tabelle su più colonne utilizzando una chiave composta primaria in una tabella e una chiave composta esterna in un'altra.
Esempio:
Il nostro database ha tre tabelle denominate student
, enrollment
e payment
. Lo student
la tabella contiene dati nelle seguenti colonne:id
(chiave primaria), first_name
e last_name
.
id | nome | cognome |
---|---|---|
1 | Elli | Willson |
2 | Tom | Marrone |
3 | Sandra | Mugnaio |
La enrollment
tabella contiene dati nelle seguenti colonne:chiave primaria (student_id
e course_code
), is_active
e start_date
.
ID_studente | codice_corso | è_attivo | data_inizio |
---|---|---|---|
1 | GD03 | vero | 20-01-2020 |
1 | AP01 | falso | 10-03-2020 |
2 | SL01 | vero | 05-05-2020 |
3 | SL01 | vero | 01-06-2020 |
Il payment
tabella contiene dati nelle seguenti colonne:chiave esterna (student_id
e course_code
, le chiavi primarie della enrollment
tabella), status
e amount
.
ID_studente | codice_corso | stato | importo |
---|---|---|---|
1 | GD03 | pagato | 230 |
1 | AP01 | in attesa | 100 |
2 | SL01 | in attesa | 80 |
3 | SL01 | in attesa | 110 |
Mostriamo il nome di ogni studente, il codice del corso, lo stato del pagamento e l'importo.
Soluzione:
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;
cognome | nome | codice_corso | stato | importo |
---|---|---|---|---|
Willson | Elli | GD03 | pagato | 230 |
Willson | Elli | AP01 | in attesa | 100 |
Marrone | Tom | SL01 | in attesa | 80 |
Mugnaio | Sandra | SL01 | in attesa | 110 |
Discussione:
Se desideri ottenere i dati archiviati in tabelle unite da una chiave composta che è una chiave primaria in una tabella e una chiave esterna in un'altra tabella, usa semplicemente una condizione di join su più colonne.
In una tabella unita (nel nostro esempio, enrollment
), abbiamo una chiave primaria costruita da due colonne (student_id
e course_code
). Nella seconda tabella (payment
), abbiamo colonne che sono una chiave composta esterna (student_id
e course_code
). Come possiamo unire le tabelle con queste chiavi composte?
Facile! Dobbiamo solo usare un JOIN
clausola con più di una condizione utilizzando l'operatore AND dopo la prima condizione. Nel nostro esempio, utilizziamo questa condizione:
p.course_code=e.course_code AND p.student_id=e.student_id
Nella prima parte, utilizziamo lo student_id
colonna dalla enrollment
tabella e student_id
dal payment
tavolo. Nella condizione successiva, otteniamo il course_code
colonna dalla enrollment
tabella e course_code
dal payment
tabella.
Nota che lo student_id
e course_code
le colonne formano una chiave primaria nella enrollment
tavolo. Pertanto, vengono utilizzati nel payment
tabella come chiave esterna.