Nie ma nic (o czym wiem), co można zrobić z prawym złączeniem, czego nie można zrobić z lewym złączeniem. Ale czasami składnia z lewymi złączeniami jest brzydsza. Powiedzmy, że masz następujące tabele:
Persons
ID | Name
Orders
ID | CustomerId | other unimportant stuff
SpecialOrderDetails
ID | OrderId | other stuff
Powiedzmy, że musisz uzyskać listę wszystkich osób w bazie danych i wszystkich ich zamówień ze specjalnymi szczegółami zamówienia (powiemy, że nie wszystkie zamówienia mają specjalne szczegóły zamówienia). Więc zwykle wykonujesz lewe łączenie od ludzi do zamówień. Ale musisz dołączyć w szczegółach specjalnych zamówień. Jeśli użyjesz tam połączenia wewnętrznego, to skutecznie sprawi, że lewe połączenie od ludzi zamieni się w połączenie wewnętrzne. IE: to jest to, co chcesz zrobić, ale nie działa (wykluczy to każdego, kto nie ma specjalnego zamówienia):
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
Więc możesz przepisać to tak:
--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
Nie do końca jasne (zakładając brak komentarzy), ale spełnia swoje zadanie. Jeśli jest to coś więcej niż jednorazowe (tj. Coś, co kiedyś będzie musiało wrócić i utrzymywać), użycie odpowiedniego łączenia może wyjaśnić, co było celem.
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
Co jest nieco bardziej zwięzłe i jasne (ale tylko jeśli ktokolwiek to czyta, rozumie właściwe dołączenia). Zauważ, że można to napisać przy lewych złączeniach, ale wymaga to zagnieżdżenia (z którym prawdopodobnie mniej osób jest zaznajomionych niż prawe).
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
W tym momencie jest to wybór tego, co jest najbardziej zrozumiałe i co zrozumie większość ludzi (czy wiesz, jak korzystać z tej składni, jeśli nie wiesz, że nazywa się to łączeniem zagnieżdżonym?).
Krótko mówiąc, nie potrzebujesz dokładnie odpowiednich połączeń, ale mogą one ułatwić czytanie.