Использование внешних соединений

Завершено

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

Ранее вы узнали, как использовать INNER JOIN для поиска соответствующих строк между двумя таблицами. Как вы видели, обработчик запросов создает результаты запроса INNER JOIN, отфильтровав строки, которые не соответствуют условиям, выраженным в предикате предложения ON. Результатом является то, что возвращаются только строки с соответствующей строкой в другой таблице. С помощью ВНЕШНЕГО СОЕДИНЕНИЯ можно отобразить все строки, которые имеют соответствующие строки между таблицами, а также все строки, не имеющие совпадения в другой таблице. Рассмотрим пример, а затем рассмотрим этот процесс.

Сначала изучите следующий запрос, написанный с помощью INNER JOIN:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Эти строки представляют соответствие между HR.Сотрудник и Sales.SalesOrder. В результатах будут отображаться только те значения EmployeeID , которые находятся в обеих таблицах.

Схема Венна с соответствующими элементами наборов Employee и SalesOrder

Теперь давайте рассмотрим следующий запрос, написанный в виде LEFT OUTER JOIN:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

В этом примере используется оператор LEFT OUTER JOIN, который направляет обработчик запросов для сохранения всех строк из таблицы слева (HR). Employee) и отображает значения "Сумма " для соответствующих строк в Sales.SalesOrder. Однако возвращаются все сотрудники, независимо от того, приняли ли они заказ на продажу. Вместо значения Сумма запрос вернет значение NULL для сотрудников без соответствующих заказов на продажу.

Схема Венна с результатами внешнего соединения наборов Employee и SalesOrder

Синтаксис OUTER JOIN

Внешние соединения выражаются с помощью ключевых слов LEFT, RIGHT или FULL, предшествующих OUTER JOIN. Цель ключевого слова — указать, какая таблица (на какой стороне ключевого слова JOIN) должна быть сохранена и отображать все её строки, независимо от наличия совпадений.

При использовании LEFT, RIGHT или FULL для определения соединения можно опустить ключевое слово OUTER, как показано ниже:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Однако, как и ключевое слово INNER, часто полезно писать код, который явно относится к используемому типу соединения.

При написании запросов с помощью OUTER JOIN рассмотрите следующие рекомендации:

  • Как вы видели, псевдонимы таблиц предпочтительны не только для списка SELECT, но и для предложения ON.
  • Как и при использовании INNER JOIN, OUTER JOIN может выполняться для одного соответствующего столбца или нескольких соответствующих атрибутов.
  • В отличие от INNER JOIN, порядок, в котором перечислены таблицы и присоединены в предложении FROM , имеет значение для OUTER JOIN, так как он определяет, будет ли ваше соединение LEFT или RIGHT.
  • Соединения с несколькими таблицами сложнее, когда используется ВНЕШНЕЕ СОЕДИНЕНИЕ. Наличие значений NULL в результатах ВНЕШНЕГО СОЕДИНЕНИЯ может создать проблемы, если промежуточные результаты затем соединяются с третьей таблицей. Строки с значениями NULL могут быть отфильтрованы с помощью предиката второго соединения.
  • Чтобы отобразить только строки, в которых нет совпадений, добавьте тест для NULL в предложении WHERE после предиката OUTER JOIN.
  • Полное внешнее соединение используется редко. Он возвращает все совпадающие строки между двумя таблицами, все строки из первой таблицы, не имеющие совпадений во второй, и все строки из второй таблицы, не имеющие совпадений в первой.
  • Нет способа предсказать порядок возврата строк без предложения ORDER BY. Нет способа узнать, будут ли сначала возвращены соответствующие или несоответствующие строки.