Recupero di dati da tabelle correlate in Python
Facciamo una query che recuperi
tutti gli utenti insieme alle loro città. Per questo
servirà il comando LEFT
JOIN:
La sua sintassi è la seguente:
SELECT campi FROM nome_tabella
LEFT JOIN nome_tabella_correlata ON condizione_collegamento
WHERE condizione_selezione
Analizziamo le singole parti della sintassi di questo comando.
Campi
Poiché la selezione avviene da più tabelle,
selezionare tutti i campi con * non
funzionerà. La seguente query selezionerà
i campi solo dalla tabella principale, ma non da
quella correlata:
SELECT *
Affinché i dati vengano selezionati da tutte
le tabelle, è necessario specificare il nome
della tabella prima di *:
SELECT users.*, cities.*
In alternativa, è possibile elencare i campi che ci servono specificando il nome della tabella prima di essi:
SELECT users.name, cities.name
Questi due metodi hanno un problema. Il fatto è che se i campi nelle tabelle hanno nomi identici, nell'array Python si verificherà un conflitto di nomi e vincerà solo un campo, mentre il secondo non sarà presente.
Per risolvere il problema, è necessario rinominare
i nomi in conflitto tramite il comando
as:
SELECT users.name, cities.name as city_name
Collegamento
Dopo il comando ON dobbiamo specificare
i campi delle due tabelle attraverso i quali viene stabilito
il collegamento. Nel nostro caso saranno il campo id
della tabella delle città e il campo city_id
della tabella degli utenti:
ON cities.id=users.city_id
Query
Alla fine, la query che recupererà gli utenti insieme alle loro città sarà la seguente:
SELECT
users.name, cities.name as city_name
FROM
users
LEFT JOIN cities ON cities.id=users.city_id
Problemi pratici
Supponiamo di avere una tabella con i prodotti e una tabella con le loro categorie. Scrivi una query che recuperi i nomi dei prodotti insieme alle loro categorie.