Non c'è nulla (che io sappia) che possa essere fatto con un join destro che non può essere fatto con un join sinistro. Ma a volte la sintassi con i join di sinistra è più brutta. Supponiamo che tu abbia le seguenti tabelle:
Persons
ID | Name
Orders
ID | CustomerId | other unimportant stuff
SpecialOrderDetails
ID | OrderId | other stuff
Supponiamo che tu abbia bisogno di ottenere un elenco di tutte le persone nel tuo database e degli ordini che hanno con i dettagli degli ordini speciali (diremo che non tutti gli ordini hanno dettagli sugli ordini speciali). Quindi normalmente farai un join di sinistra dalle persone agli ordini. Ma poi devi unirti ai dettagli dell'ordine speciale. Se si utilizza un join interno, esso renderebbe efficacemente il join sinistro dalle persone agli ordini in un join interno. IE: questo è quello che vuoi fare ma non funziona (escluderà chiunque non abbia un ordine speciale):
select p.*, o.*, d.*
from Persons p
left join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id
Quindi potresti riscriverlo come segue:
--get all the people without a special order
select p.*, NULL, NULL, ... --NULLs placeholders for all the fields from OrderDetails and SpecialOrderDetails
from Persons p
left join Orders o on o.CustomerId = p.Id
left join SpecialOrderDetails d on d.OrderId = o.Id
where o.Id is null
union
--get all the people with a special order
select p.*, o.*, d.*
from Persons p
inner join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id
Non esattamente chiaro (supponendo che non ci siano commenti), ma fa il lavoro. Se questo è qualcosa di più di una tantum (cioè qualcosa che qualcuno dovrà tornare e mantenere un giorno) usando un join giusto potrebbe rendere più chiaro quale fosse l'intento.
select p.*, o.*, d.*
from Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
right join Persons p on p.Id = o.CustomerId
Che è un po 'più succinto e chiaro (ma solo se chi sta leggendo comprende giusti join). Nota che questo può essere scritto con i join di sinistra, ma richiede un join nidificato (con meno probabilità che le persone abbiano familiarità con i giusti join).
select p.*, o.*, d.*
from Persons p
left join Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
on o.CustomerId = p.Id
A questo punto, è una scelta di ciò che è più chiaro e ciò che la maggior parte delle persone capirà (sapresti come google che sintassi se non sapessi che è stato chiamato un join annidato?).
In breve, non hai strettamente bisogno giusti giusti, ma potrebbero renderlo più facile da leggere.