Inoltre, come si inseriscono la LEFT JOIN
, la RIGHT JOIN
e la FULL JOIN
?
Supponendo che tu stia unendo su colonne senza duplicati, che è un caso molto comune:
Un join interno di A e B dà il risultato di A intersecare B, cioè la parte interna di un diagramma di Venn intersezione.
Un'unione esterna di A e B dà il risultato di A union B, cioè le parti esterne di un'unione del diagramma di Venn.
Esempi
Supponiamo di avere due tabelle, con una sola colonna ciascuna, e dati come segue:
A B
- -
1 3
2 4
3 5
4 6
Notate che (1,2) sono unici per A, (3,4) sono comuni, e (5,6) sono unici per B.
Unione interna
Un join interno usando una delle due query equivalenti dà l'intersezione delle due tabelle, cioè le due righe che hanno in comune.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Left outer join
Un join esterno sinistro darà tutte le righe in A, più qualsiasi riga comune in B.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Unione esterna destra
Un join esterno destro darà tutte le righe in B, più qualsiasi riga comune in A.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
Full outer join
Una full outer join vi darà l'unione di A e B, cioè tutte le righe in A e tutte le righe in B. Se qualcosa in A non ha un dato corrispondente in B, allora la parte B è nulla, e viceversa.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
Un join interno mostra solo le righe se c'è un record corrispondente sull'altro lato (destro) del join.
Un join esterno (sinistro) mostra le righe per ogni record sul lato sinistro, anche se non ci sono righe corrispondenti sull'altro lato (destro) del join. Se non c'è nessuna riga corrispondente, le colonne per l'altro lato (destro) mostrerebbero NULL.
Le unioni interne richiedono che un record con un ID correlato esista nella tabella unita.
Le unioni esterne restituiranno record per il lato sinistro anche se non esiste nulla per il lato destro.
Per esempio, avete una tabella Orders e una tabella OrderDetails. Sono collegate da un "OrderID".
Ordini
OrderDetails
La richiesta
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
restituirà solo gli ordini che hanno anche qualcosa nella tabella OrderDetails.
Se lo cambiate in OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
allora restituirà i record della tabella Ordini anche se non hanno record OrderDetails.
Potete usarlo per trovare gli ordini che non hanno alcun OrderDetails, indicando un possibile ordine orfano, aggiungendo una clausola where come WHERE OrderDetails.OrderID IS NULL
.