Un articolo che cerca di mostrare in modo intuitivo qual’è la differenza fra INNER, LEFT e RIGHT Join in linguaggio SQL.
Più di qualche volta, sui forum e nelle richieste che mi vengono fatte da chi sta iniziando a lavorare con il linguaggio SQL mi viene detto:
“Non capisco la differenza tra Inner Join, e Left o Right outer Join†Pertanto provo a spiegarlo con un disegnino e un paio di note:
Date due tabelle:
Tabella Left (testata) contiene i campi IDTs e DescrizioneTs
Tabella Right (righe) contiene i campi IDRg, IDTs, DescrizioneRg, ValoreRg
Una Inner Join:
SELECT ts.IDTs, ts.DescrizioneTs, rg.IDRg, rg.DescrizioneRg, rg.ValoreRg FROM TabellaLeft ts INNER JOIN TabellaRight rg ON ts.IDTs = rg.IDTs
E’ rappresentata graficamente dal disegno qui sotto e restituisce Tutte le righe della tabella TS (left) che hanno almeno una corrispondenza nella tabella RG (right) pertanto, se vi fossero delle testate senza alcuna riga, non verrebbero visualizzate.
Una Left Outer Join:
SELECT ts.IDTs, ts.DescrizioneTs, rg.IDRg, rg.DescrizioneRg, rg.ValoreRg FROM TabellaLeft ts LEFT OUTER JOIN TabellaRight rg ON ts.IDTs = rg.IDTs
E’ rappresentata graficamente nel disegno qui sotto e restituisce tutte le righe della tabella TS (Left) e solo le righe della tabella RG che hanno corrispondenza nella tabella TS, pertanto se vi sono Righe la cui TS non esiste (posto che non vi sia una relazione di foreign key a impedire questo tipo di possibilità) queste righe non saranno visibili in questa Join. Se la testata non avesse alcuna riga, comunque comparirà e i dati relativi alla riga saranno a NULL
Una Right Outer Join:
SELECT ts.IDTs, ts.DescrizioneTs, rg.IDRg, rg.DescrizioneRg, rg.ValoreRg FROM TabellaLeft ts RIGHT OUTER JOIN TabellaRight rg ON ts.IDTs = rg.IDTs
E’ rappresentata graficamente nel disegno qui sotto e restituisce tutte le righe della tabella RG (Right) e solo le righe della tabella TS che hanno corrispondenza nella tabella RG, pertanto se vi sono Righe la cui TS non esiste (posto che non vi sia una relazione di foreign key a impedire questo tipo di possibilità) queste righe saranno visibili ma i campi rappresentanti i dati di Testata saranno NULL.
Sperando di aver contribuito a fare un po’ di chiarezza ai principianti, vi auguro buon lavoro.