Non c'è nulla (che io sappia) che può 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 di tutti gli ordini che hanno con dettagli di ordini speciali (diremo che non tutti gli ordini hanno dettagli di ordini speciali). Quindi normalmente faresti un join sinistro dalle persone agli ordini. Ma poi devi unirti ai dettagli dell'ordine speciale. Se si utilizza un join interno lì, farebbe effettivamente 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 questo:
--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 (assumendo nessun commento), ma fa il lavoro. Se si tratta di qualcosa di più di una tantum (cioè qualcosa che qualcuno dovrà tornare e mantenere un giorno) usando un giusto join 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ù conciso e chiaro (ma solo se chi lo sta leggendo capisce le giuste iscrizioni). Si noti che questo può essere scritto con join di sinistra, ma richiede un join nidificato (con cui probabilmente meno persone conoscono i join di destra).
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 quella sintassi se non sapessi che è stato chiamato un join nidificato?).
In breve, non sono strettamente necessari i giusti join, ma potrebbero rendere più semplice la lettura.