Нет ничего (о чем я знаю), которое можно сделать с правым соединением, чего нельзя сделать с левым соединением. Но иногда синтаксис с левыми соединениями выглядит ужаснее. Допустим, у вас есть следующие таблицы:
Persons
ID | Name
Orders
ID | CustomerId | other unimportant stuff
SpecialOrderDetails
ID | OrderId | other stuff
Допустим, вам нужно получить список всех людей в вашей базе данных и всех заказов, которые у них есть, с особыми деталями заказа (скажем, что не все заказы имеют особые детали заказа). Таким образом, вы обычно делаете левое соединение от людей к заказам. Но тогда вы должны присоединиться в деталях специального заказа. Если вы используете там внутреннее соединение, это фактически сделает левое соединение людей от заказов во внутреннее соединение. IE: это то, что вы хотите сделать, но не работает (это исключит любого, у кого нет специального заказа):
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
Таким образом, вы можете переписать это так:
--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
Не совсем понятно (без комментариев), но это делает работу. Если это нечто большее, чем одноразовое (то есть что-то, что кто-то собирается когда-нибудь вернуться и поддержать), использование правильного соединения может прояснить, каково было намерение.
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
Что является более кратким и ясным (но только если тот, кто читает, понимает правильные соединения). Обратите внимание, что это можно записать с помощью левых объединений, но для этого требуется вложенное объединение (с которым, вероятно, меньше людей знакомо, чем с правыми объединениями).
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
На данный момент, это выбор того, что наиболее ясно и что большинство людей поймет (знаете ли вы, как использовать этот синтаксис в Google, если вы не знали, что он называется вложенным объединением?).
Короче говоря, вам не нужны правильные объединения, но они могут облегчить чтение.