Если я правильно понимаю, каждый RIGHT JOIN
:
SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID
можно выразить как LEFT JOIN
:
SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID
Мое личное мнение таково, что в заявлении говорится:
- Сначала получите
Persons
- Затем разверните / повторите по
Persons
мере необходимости, чтобы соответствоватьOrders
лучше выражается в порядке, Persons LEFT JOIN Orders
чем в обратном порядке Orders RIGHT JOIN Persons
(и я никогда не использую RIGHT JOIN
в результате).
Есть ли ситуации, когда RIGHT JOIN
предпочтение отдается? Или есть ли случаи, когда RIGHT JOIN
можно сделать что-то, что LEFT JOIN
не может?
database-design
sql
relational-database
Зев Шпиц
источник
источник
RIGHT JOIN
рекомендуется или более распространенным. Если это ваша предпосылка, это неправильно. Я не могу вспомнить время, когда я видел правильное соединение, использованное ни в коде, ни в примерах. ЭтоJOIN
илиLEFT OUTER JOIN
. В редких случаях вы можете увидетьFULL OUTER JOIN
.Ответы:
Это зависит от того, какое требование вы пытаетесь выполнить.
Это не то же самое, что сказать: «дай мне всех людей и их соответствующие заказы», что «я хочу, чтобы все заказы с их соответствующими лицами» , особенно если вы собираетесь использовать,
is null
чтобы привести строки без соответствующего соответствия. Это то, что я называю «доминантной таблицей», то есть таблицей, из которой я хочу получать строки, независимо от того, не было ли соответствующей строки на другой стороне соединения.Посмотрите на эти изображения, и вы заметите, что они не совпадают:
Источник изображения - это отличная статья .
Но вы правы в том, что оба требования могут быть выполнены с любым объединением, просто инвертируя порядок таблиц в объединении.
Но я предполагаю, что для западных людей, привыкших писать слева направо, более естественно использовать левое соединение вместо правого , поскольку мы видим, как будто мы хотим, чтобы соединения были в том же направлении или в том же порядке, что и
select
столбцы ed.Таким образом, возможная причина предпочитать правое объединение состоит в том, что в вашей культуре вы пишете справа налево (как в арабской или ивритской системах письма), и вы склонны мыслить таким образом, то есть, возможно, в вашем мозгу текстовая информация течет справа налево ,
Некоторые лингвисты считают, что ваш язык влияет на ваш образ мышления: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think
источник
LEFT JOIN
более естественным.Нет ничего (о чем я знаю), которое можно сделать с правым соединением, чего нельзя сделать с левым соединением. Но иногда синтаксис с левыми соединениями выглядит ужаснее. Допустим, у вас есть следующие таблицы:
Допустим, вам нужно получить список всех людей в вашей базе данных и всех заказов, которые у них есть, с особыми деталями заказа (скажем, что не все заказы имеют особые детали заказа). Таким образом, вы обычно делаете левое соединение от людей к заказам. Но тогда вы должны присоединиться в деталях специального заказа. Если вы используете там внутреннее соединение, это фактически сделает левое соединение людей от заказов во внутреннее соединение. IE: это то, что вы хотите сделать, но не работает (это исключит любого, у кого нет специального заказа):
Таким образом, вы можете переписать это так:
Не совсем понятно (без комментариев), но это делает работу. Если это нечто большее, чем одноразовое (то есть что-то, что кто-то собирается когда-нибудь вернуться и поддержать), использование правильного соединения может прояснить, каково было намерение.
Что является более кратким и ясным (но только если тот, кто читает, понимает правильные соединения). Обратите внимание, что это можно записать с помощью левых объединений, но для этого требуется вложенное объединение (с которым, вероятно, меньше людей знакомо, чем с правыми объединениями).
На данный момент, это выбор того, что наиболее ясно и что большинство людей поймет (знаете ли вы, как использовать этот синтаксис в Google, если вы не знали, что он называется вложенным объединением?).
Короче говоря, вам не нужны правильные объединения, но они могут облегчить чтение.
источник
SELECT p.*, o.*, d.* FROM Persons p LEFT JOIN Orders o ON o.CustomerID = p.ID LEFT JOIN SpecialOrders d ON o.Id = d.OrderID
.Я мог видеть, что ПРАВОЕ СОЕДИНЕНИЕ используется для целей репликации / слияния. Допустим, у меня есть две таблицы A и B. A слева и B справа. Допустим, я хотел реплицировать данные между этими двумя таблицами, чтобы сделать их эквивалентными.
Если бы я хотел показать все данные, которые были в A, но не в B, это было бы ЛЕВОЕ соединение. Если бы я хотел показать все данные в B, которых не было в A, он бы УЖЕ присоединился.
Таким образом, иногда LEFT и RIGHT оказываются полезными при объединении и репликации данных, чтобы держать вещи в перспективе.
Кроме этого, я не вижу другой причины использовать соединение RIGHT, поскольку все соединения RIGHT могут быть преобразованы в соединения LEFT или наоборот, все соединения LEFT могут быть преобразованы в соединения RIGHT в зависимости от того, как таблицы упорядочены или визуализированы. Таким образом, это было бы вопросом предпочтения в других случаях.
Вот хорошая ссылка для визуализации соединений SQL.
http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
источник
левое соединение не является противоположностью правому соединению, проверьте следующий случай, который дает разные результаты
таблицы b anc c всегда внутренне соединены, но в первом a слева соединены с остальными, а во втором a соединены справа
левое соединение не возвращает строк, тогда как правое соединение возвращает строки
источник
Там никогда нет никаких причин, чтобы предпочесть
RIGHT JOIN
, иLEFT JOIN
гораздо яснее:поскольку это позволяет вам сразу увидеть, какая таблица запрашивается. Тогда как с
RIGHT JOIN
:первая таблица написана после
JOIN
.По своему опыту я никогда не видел
RIGHT JOIN
.источник
RIGHT JOIN
? ,