Что лучше .. левое внешнее соединение или правое внешнее соединение? - PullRequest
7 голосов
/ 09 сентября 2011

Мы можем получить один и тот же результат обоими этими способами.

Table_1 LEFT OUTER JOIN Table_2

Table_2 RIGHT OUTER JOIN Table_1

Если мы можем получить одинаковый результат, зачем использовать правое внешнее соединение?Какой из них лучше?

Ответы [ 5 ]

13 голосов
/ 09 сентября 2011

Как уже указывали другие * LEFT OUTER JOIN и RIGHT OUTER JOIN - это точно одна и та же операция, за исключением случаев, когда их аргументы обращены вспять. Ваш вопрос похож на вопрос, лучше ли написать a < b или b > a. Они одинаковые - это просто вопрос предпочтений.

Сказав это, я обнаружил, что большинство людей более знакомы с LEFT JOIN и последовательно используют его в своем SQL. Некоторым людям даже трудно читать, если вдруг в середине запроса появляется RIGHT JOIN, и это заставляет их остановиться и подумать, что это значит. Поэтому я бы предложил, чтобы при равном выборе между двумя вариантами, предпочтительнее использовать LEFT JOIN. Последовательность поможет другим разработчикам понять ваш SQL.

4 голосов
/ 09 сентября 2011

Они равны, просто вопрос предпочтения и читаемости.Я предполагаю, что это те же таблицы?

2 голосов
/ 09 сентября 2011

Разработчики языка SQL справедливо считали, что принудительное использование приоритетов объединений слева направо было бы ненужным ограничением для языка (к сожалению, они не чувствовали то же самое при упорядочении столбцов!)

Кажется, что здесь, на Stackoverflow, есть сильное предпочтение LEFT OUTER, в той степени, в которой люди изменят все соединение, просто чтобы иметь возможность использовать LEFT (у нас был один здесь просто вчера).

Скажем, вы изначально написали в своем запросе Table_2 INNER JOIN Table_1, прежде чем поняли, что вам действительно нужно внешнее соединение, сохраняющее все строки из Table_1. Было бы намного проще просто изменить INNER на RIGHT OUTER, чем изменить все соединение, чтобы иметь возможность использовать LEFT OUTER. Простой - это хорошо, потому что он менее инвазивен и, следовательно, меньше риск непреднамеренного изменения намерения запроса.

Чтобы использовать другой подобный пример, рассмотрим реляционный оператор semi join ; Будучи частью реляционной алгебры, технология не может считаться полностью завершенной без нее. Хотя стандартный SQL имеет предикат полусоединения MATCH, он не получил широкого применения. Однако большинство продуктов SQL поддерживают различные обходные пути. Наиболее распространенный подход, используемый в Stackoverflow, заключается в использовании INNER JOIN с DISTINCT в предложении SELECT и исключении атрибутов из объединенной таблицы. За этим следует использование WHERE table_1.ID IN (SELECT ID FROM Table_2). Следующим по популярности является WHERE EXISTS (SELECT * FROM Table_2 WHERE table_1.ID = table_1.ID).

Дело в том, что все вышеперечисленное - это полусоединения, которые очень часто встречаются в дикой природе. Хотя мое личное предпочтение - использовать EXISTS (хотя, что любопытно, оно ближе к реляционному исчислению), мне все же нужно быть в состоянии идентифицировать другие как полусоединения; Интересно, что самый популярный подход (INNER JOIN плюс DISTINCT плюс непроекция) может быть самым трудным для идентификации!

Рефакторинг кода с единственной целью подгонки его к личному стилю справедливо осуждается: затраты на ненужные усилия, увеличение риска, использование контроля над источниками и т. Д. Обучение распознаванию и уважению других предпочтений является важным навыком: если вы обнаружите себя Реорганизовав один раз, чтобы понять это, вы поставите себя в невыгодное положение.

Конечно, с точки зрения отношений, «правильный» ответ - полностью избегать внешних объединений. В реляционной модели отсутствует такая вещь, как нуль, а внешние объединения специально предназначены для создания нулей.

2 голосов
/ 09 сентября 2011

левое внешнее соединение

Результат левого внешнего соединения (или просто левого соединения) для таблиц A и B всегда содержит все записи "левой" таблицы (A), даже если условие соединения не находит ни одной подходящей записи в " правый «стол» (B). Это означает, что если предложение ON соответствует 0 (нулю) записей в B, объединение все равно будет возвращать строку в результате, но с NULL в каждом столбце из B. Это означает, что левое внешнее объединение возвращает все значения из левой таблицы плюс сопоставленные значения из правой таблицы (или NULL в случае отсутствия соответствующего предиката соединения)

правое внешнее соединение

Правое внешнее соединение (или правое соединение) очень похоже на левое внешнее соединение , за исключением обработки обращенных таблиц . Каждая строка из «правой» таблицы (B) появится в объединенной таблице хотя бы один раз. Если не найдено подходящей строки из «левой» таблицы (A), в столбцах от A появится NULL. те записи, у которых нет совпадений в B. Правое внешнее соединение возвращает все значения из правой таблицы и совпадающие значения из левой таблицы (NULL в случае отсутствия совпадающего предиката соединения).

http://en.wikipedia.org/wiki/Join_%28SQL%29

1 голос
/ 09 сентября 2011

Это зависит от наших потребностей - нужны ли нам все столбцы из левой или правой таблицы.

Оба не совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...