Published on

October 4, 2023

Понимание RIGHT OUTER JOIN в SQL Server

При работе с SQL Server существует различные варианты объединения таблиц для получения нужных результатов. Один из этих вариантов – RIGHT OUTER JOIN. В этой статье мы рассмотрим концепцию RIGHT OUTER JOIN и как его можно использовать в коде T-SQL.

Что такое RIGHT OUTER JOIN?

В T-SQL JOIN используется для объединения записей из двух или более таблиц. RIGHT OUTER JOIN является одной из трех форм OUTER JOIN. Он используется для объединения таблиц таким образом, что все строки из правой таблицы возвращаются, независимо от наличия совпадения в левой таблице. Это означает, что если совпадения нет, для столбцов из левой таблицы будут возвращены значения NULL.

RIGHT JOIN против LEFT JOIN

Ключевые слова RIGHT и LEFT в операторе JOIN фактически делают одно и то же, но их поведение зависит от порядка таблиц, указанных в операторе FROM. Например, для получения всех строк из TableA и отображения совпадений с TableB оба следующих фрагмента кода дадут одинаковые результаты:

From TableB (левая таблица) RIGHT OUTER JOIN TableA (правая таблица)

From TableA (левая таблица) LEFT OUTER JOIN TableB (правая таблица)

Ключевые слова RIGHT и LEFT определяют место в запросе, где будут возвращены все строки. В обоих случаях для TableA будут возвращены все строки.

Когда использовать RIGHT OUTER JOIN

RIGHT OUTER JOIN используется, когда вы хотите объединить записи из таблиц и вернуть все строки из одной таблицы, отображая столбцы из другой таблицы, если есть совпадение, или значения NULL, если совпадения нет. Это может быть полезно, когда вы хотите получить данные из таблицы, даже если в другой таблице нет соответствующих записей.

Пример: Заказы на закупку по поставщику

Рассмотрим пример, в котором у нас есть две таблицы: Vendor и PurchaseOrderHeader. В таблице Vendor есть столбец с первичным ключом BusinessEntityID, который ссылается на столбец VendorID в таблице PurchaseOrderHeader в качестве внешнего ключа. Мы можем использовать RIGHT OUTER JOIN, чтобы получить все записи PurchaseOrderHeader с строками для каждого поставщика. Вот синтаксис:

SELECT 
   v.BusinessEntityID,
   v.AccountNumber,
   v.Name,
   po.PurchaseOrderID, 
   po.VendorID, 
   po.OrderDate, 
   po.SubTotal, 
   po.TaxAmt, 
   po.Freight, 
   po.TotalDue
FROM [Purchasing].[PurchaseOrderHeader] as po
   RIGHT OUTER JOIN [Purchasing].[Vendor] as v  ON po.VendorID = v.BusinessEntityID
ORDER BY po.OrderDate, v.BusinessEntityID;

Вышеприведенный запрос вернет все записи PurchaseOrderHeader вместе с соответствующей информацией о поставщике. Если у поставщика нет заказов на закупку, столбцы PurchaseOrderHeader будут содержать значения NULL.

Пример: Заказы на закупку с деталями по поставщику

В этом примере мы продолжим предыдущий запрос и используем INNER JOIN для объединения таблиц Product Header, Details и Products. Затем мы будем использовать RIGHT OUTER JOIN, чтобы включить поставщиков, у которых нет приобретенных продуктов. Вот синтаксис:

SELECT 
   po.VendorID, 
   v.AccountNumber,
   v.Name,
   po.PurchaseOrderID, 
   pod.ProductID, 
   p.ProductNumber,
   p.Name, 
   pod.OrderQty, 
   pod.UnitPrice, 
   pod.LineTotal
FROM ([Purchasing].[PurchaseOrderHeader] as po 
   INNER JOIN [Purchasing].[PurchaseOrderDetail] as pod ON pod.PurchaseOrderID = po.PurchaseOrderID
   INNER JOIN [Production].[Product] as p ON p.ProductID = pod.ProductID)
   RIGHT OUTER JOIN [Purchasing].[Vendor] as v ON po.VendorID = v.BusinessEntityID
ORDER BY 1;

Вышеприведенный запрос объединяет четыре таблицы с использованием INNER JOIN и RIGHT OUTER JOIN. Он извлекает заказы на закупку вместе с их деталями и включает поставщиков, у которых нет приобретенных продуктов. RIGHT OUTER JOIN к таблице Vendor должен быть последним объединением в запросе, чтобы обеспечить нужные результаты.

Понимая концепцию RIGHT OUTER JOIN и его использование в SQL Server, вы можете эффективно извлекать данные из нескольких таблиц, даже если нет совпадающих записей.

Статья последний раз обновлена: 2021-06-24

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.