Miten LEFT JOIN
, RIGHT JOIN
ja FULL JOIN
sopivat tähän?
Olettaen, että yhdistät sarakkeita, joissa ei ole kaksoiskappaleita, mikä on hyvin yleinen tapaus:
A:n ja B:n sisäinen liitos antaa tuloksen A intersect B, eli Venn-diagrammin sisäisen osan leikkauksesta.
A:n ja B:n ulkoinen liitos antaa tuloksen A union B, eli Venn-diagrammin unionin ulkoiset osat.
Esimerkkejä
Oletetaan, että sinulla on kaksi taulukkoa, joissa kummassakin on yksi sarake ja tiedot ovat seuraavat:
A B
- -
1 3
2 4
3 5
4 6
Huomaa, että (1,2) ovat A:n yksilöllisiä, (3,4) ovat yhteisiä ja (5,6) ovat B:n yksilöllisiä.
Sisäliitäntä
Sisäinen liitos, jossa käytetään jompaakumpaa vastaavaa kyselyä, antaa kahden taulukon leikkauspisteen, eli ne kaksi riviä, jotka niillä on yhteisiä.
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
Vasemmanpuoleinen ulompi liitos
Vasemmanpuoleinen ulompi liitos antaa kaikki A:n rivit sekä kaikki B:n yhteiset rivit.
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
Oikea ulompi liitos
Oikea ulompi liitos antaa kaikki B:n rivit sekä kaikki A:n yhteiset rivit.
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
Täydellinen ulompi liitos
Täydellinen ulompi liitos antaa sinulle A:n ja B:n liitoksen, eli kaikki A:n rivit ja kaikki B:n rivit. Jos jollakin A:ssa olevalla tiedolla ei ole vastaavaa dataa B:ssä, B:n osa on nolla, ja päinvastoin.
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
Sisempi liitos näyttää rivejä vain, jos liitoksen toisella (oikealla) puolella on vastaava tietue.
(Vasemmanpuoleinen) ulompi liitos näyttää rivit jokaisesta vasemmanpuoleisesta tietueesta, vaikka liitoksen toisella (oikealla) puolella ei olisikaan vastaavia rivejä. Jos vastaavaa riviä ei ole, toisen (oikean) puolen sarakkeissa näkyy NULL.
Sisäiset yhdistämiset edellyttävät, että yhdistetyssä taulussa on tietue, jolla on vastaava tunniste.
Outer-joins palauttaa vasemman puolen tietueet, vaikka oikealla puolella ei olisi mitään tietueita.
Sinulla on esimerkiksi Orders- ja OrderDetails-taulut. Ne liittyvät toisiinsa "OrderID"-tunnuksen avulla.
Tilaukset
TilausTiedot
Pyyntö
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
palauttaa vain tilaukset, joilla on jotain myös OrderDetails-taulukossa.
Jos muutat sen muotoon OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
niin se palauttaa tietueet Orders-taulusta, vaikka niissä ei olisi OrderDetails-tietueita.
Voit käyttää tätä löytääksesi tilauksia, joilla ei ole OrderDetails-tietueita, mikä viittaa mahdolliseen orpoon tilaukseen lisäämällä where-lausekkeen, kuten WHERE OrderDetails.OrderID IS NULL
.