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.