Поделиться через


Использование внутренних соединений

Внутреннее соединение — это такое соединение, в котором значения в соединяемых столбцах подвергаются сравнению с использованием оператора сравнения.

В стандарте SQL внутренние соединения задаются предложением FROM или предложением WHERE. Это единственный тип соединения, допустимый в стандарте SQL для предложения WHERE. Внутренние соединения, задаваемые предложением WHERE, известны как внутренние соединения старого типа.

Следующий запрос на языке Transact-SQL является примером внутреннего соединения:

USE AdventureWorks;
GO
SELECT *
FROM HumanResources.Employee AS e
    INNER JOIN Person.Contact AS c
    ON e.ContactID = c.ContactID
ORDER BY c.LastName

Такое внутреннее соединение называется эквисоединением. При таком соединении сохраняются все столбцы обеих таблиц и только те строки, для которых в соединяющем столбце имеется равное значение.

Соединения с использованием операторов, отличных от равенства

Имеется также возможность соединения неравных значений двух столбцов. Чтобы соединить неравные значения, используются те же операторы и предикаты, что и для внутренних соединений. Дополнительные сведения об операторах и предикатах, доступных для использования при соединении неравных значений, см. в разделах Использование операторов в выражениях и Предложение WHERE (Transact-SQL).

В следующем примере используется соединение типа «меньше, чем» (<) для поиска цен сбыта на изделие 718, которые ниже рекомендованных цен на это изделие по прейскуранту.

USE AdventureWorks;
GO
SELECT DISTINCT p.ProductID, p.Name, p.ListPrice, sd.UnitPrice AS 'Selling Price'
FROM Sales.SalesOrderDetail AS sd
    JOIN Production.Product AS p 
    ON sd.ProductID = p.ProductID AND sd.UnitPrice < p.ListPrice
WHERE p.ProductID = 718;
GO

Ниже приводится результирующий набор.

ProductID   Name                        ListPrice          Selling Price
----------- --------------------------- ------------------ -------------
718         HL Road Frame - Red, 44     1431.5000          758.0759
718         HL Road Frame - Red, 44     1431.5000          780.8182
718         HL Road Frame - Red, 44     1431.5000          858.90

(3 row(s) affected)

Соединения с использованием оператора «не равно»

Соединение типа «не равно» (<>) используется редко. Как правило, соединения типа «не равно» имеют смысл только в случаях самосоединения. Например, данное соединение типа «не равно» Transact-SQL и самосоединение используются для поиска подкатегорий с не менее чем двумя различными ценами ниже $15:

USE AdventureWorks;
GO
SELECT DISTINCT p1.ProductSubcategoryID, p1.ListPrice
FROM Production.Product p1
    INNER JOIN Production.Product p2
    ON p1.ProductSubcategoryID = p2.ProductSubcategoryID
    AND p1.ListPrice <> p2.ListPrice
WHERE p1.ListPrice < $15 AND p2.ListPrice < $15
ORDER BY ProductSubcategoryID;
ПримечаниеПримечание

Выражение NOT column_name = column_name эквивалентно выражению column_name <> column_name.

В следующем примере Transact-SQL совместно используются соединение типа «не равно» и самосоединение для поиска строк в таблицеProductVendor, в которой две или несколько строк имеют одинаковые коды ProductID но различающиеся коды VendorID (то есть продуктов от разных поставщиков):

USE AdventureWorks;
GO
SELECT DISTINCT p1.VendorID, p1.ProductID
FROM Purchasing.ProductVendor p1
    INNER JOIN Purchasing.ProductVendor p2
    ON p1.ProductID = p2.ProductID
WHERE p1.VendorID <> p2.VendorID
ORDER BY p1.VendorID