Ricominciamo dalle basi elementari del discorso...
Corrispondenza uno a molti, corrispondenza molti a molti.
Facciamoci un esempio pratico di corrispondenza uno a molti: un padre che ha più figli. Un padre può avere più figli, ma un figlio può avere un solo padre.
Costruiamo una tabella o due tabelle...
id Nome 1 Mario 2 Antonio 3 Giuseppe 4 Luigi
id Nome extId 1 Pierino 1 2 Carletto2 3 Gigetto 1 4 Paolino 3 5 Checco 2 6 Dadino 2 7 Lallo 1 8 Bobo 3L'extID della seconda tabella corrisponde all'ID della prima tabella.
E dunque creiamo la query che fornisce i risultati dell'unione delle tabelle:
SELECT Padri.Nome, Figli.Nome FROM Padri INNER JOIN Figli ON Padri.ID=Figli.ExtID;Ed ecco la tabella che mi viene restituita:
Padri.Nome Figli.Nome Mario Pierino Mario Gigetto Mario Lallo Antonio Carletto Antonio Checco Antonio Dadino Giuseppe Paolino Giuseppe BoboMa nel compilare la seconda tabella mi ero dimenticato che la prima comprendesse quattro records e non tre.
Così ho dimenticato dl attribuire figli al quarto genitore.
La cosa mi torna utile per insegnare a me stesso la differenza fra INNER JOIN, che ho usato in questa query, e LEFT JOIN, ipotizzando che Luigi sia un uomo che non ha ancora avuto figli.
E adesso sostituisco nella query INNER JOIN con LEFT JOIN e mi compaiono i record non "appaiati" della prima tabella.
SELECT Padri.Nome, Figli.Nome
FROM Padri LEFT JOIN Figli ON Padri.ID=Figli.ExtID;
Vediamo...
Padri.Nome Figli.Nome Mario Pierino Mario Gigetto Mario Lallo Antonio Carletto Antonio Checco Antonio Dadino Giuseppe Paolino Giuseppe Bobo Luigi ottEcco qua.
Da dove dipende che una tabella sia considerata Left o Right?
Ecco: se inverto l'ordine delle tabelle a cavallo dell'istruzione LEFT JOIN ottengo un'inversione del ruolo di Left e Right fra le due.
Anziché
SELECT Padri.Nome, Figli.Nome
FROM Padri LEFT JOIN Figli ON Padri.ID=Figli.ExtID;
scrivo, invertendo:
SELECT Padri.Nome, Figli.Nome
FROM Figli LEFT JOIN Padri ON Padri.ID=Figli.ExtID;
e ottengo questa tabella:
Padri.Nome Figli.Nome Mario Pierino Mario Gigetto Mario Lallo Antonio Carletto Antonio Checco Antonio Dadino Giuseppe Paolino Giuseppe BoboMa se adesso pongo un RIGHT JOIN cosa accadrà? Prevedibile...
SELECT Padri.Nome, Figli.Nome FROM Figli RIGHT JOIN Padri ON Padri.ID=Figli.ExtID;No...prevedibile un corno!
Padri.Nome Figli.Nome Mario Pierino Mario Gigetto Mario Lallo Antonio Carletto Antonio Checco Antonio Dadino Giuseppe Paolino Giuseppe Bobo LuigiMi viene esattamente come prima...
...è necessario che metta un po' di ordine fra i concetti di sinistra e destra...
Nessun commento:
Posta un commento