JavascriptProva

mercoledì 13 gennaio 2016

Rispolverando reminiscenze di SQL con Access. Corrispondenza uno a molti fra tabelle

Tabelle di database.
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 3
L'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 Bobo
Ma 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 ott
Ecco 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 Bobo
Ma 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
Luigi 
Mi viene esattamente come prima...

...è necessario che metta un po' di ordine fra i concetti di sinistra e destra...

Nessun commento:

Posta un commento