Join multipli sulla stessa tabella

Spesso può essere necessario fare due join sullo stesso campo della stessa tabella. Ad esempio, considerando di voler gestire un calendario di calcio, sarebbe probabile avere due tabelle, una partite, l’altra squadre. Nella prima potremmo memorizzare tutti i dati della partita, semplificando memorizzeremo, l’identificativo univoco della partita, l’id delle due squadre, e il risultato. La seconda tabella può essere utilizzata per memorizzare l’idi delle squadre, il nome e altre informazioni che non servono al nostro esempio. Come fare ora per eseguire una query che sostituisca agli id delle due squadre nella tabella partite il nome memorizzato nella tabella squadre

Ricapitolando, la tabella squadre:

tabella partite

Probabilmente, la prima soluzione che ci verrebbe in mente sarebbe quella di scrivere qualcosa del genere:

SELECT *
FROM partite
JOIN squadre ON partite.id_casa = squadre.id_squadra
JOIN squadre ON partite.id_ospiti = squadre.id_squadra

Qualcuno subito potrebbe notare che questa query andrà sicuramente in errore, in quanto così facendo stiamo chiedendo all’interprete SQL di eseguire due JOIN diverse sulla stessa tabella e sullo stesso campo, questo non gli piacerà e ci ritornerà un errore del tipo:

#1066 – Not unique table/alias: ’squadre’

La soluzione più veloce per risolvere questo problema consiste nel rinominare le tabelle su cui fare i due JOIN, ovvero rinominare la tabella squadre in modo da far credere all’interprete SQL che sia una tabella diversa. Ovvero:

SELECT *
FROM partite
JOIN squadre AS sq_casa ON partite.id_casa = sq_casa.id_squadra
JOIN squadre AS sq_ospite ON partite.id_ospite = sq_ospite.id_squadra

In questo modo è come se avessimo 3 tabelle: partite, sq_casa, sq_ospite su cui potremmo operare indipendentemente.

If you enjoyed this post, please consider to leave a comment or subscribe to the feed and get future articles delivered to your feed reader.

Comments

Non c’è ancora nessun commento.

Lascia un commento

(obbligatorio)

(obbligatorio)


*
To prove that you're not a bot, enter this code
Anti-Spam Image