Использование внутренних соединений
Внутреннее соединение — это такое соединение, в котором значения в соединяемых столбцах подвергаются сравнению с использованием оператора сравнения.
В стандарте SQL внутренние соединения задаются предложением FROM или предложением WHERE. Это единственный тип соединения, допустимый в стандарте SQL для предложения WHERE. Внутренние соединения, задаваемые предложением WHERE, известны как внутренние соединения старого типа.
Следующий запрос на языке Transact-SQL является примером внутреннего соединения:
USE AdventureWorks2008R2;
GO
SELECT *
FROM HumanResources.Employee AS e
INNER JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID
ORDER BY p.LastName
Такое внутреннее соединение называется эквисоединением. При таком соединении сохраняются все столбцы обеих таблиц и только те строки, для которых в соединяющем столбце имеется равное значение.
Соединения с использованием операторов, отличных от равенства
Имеется также возможность соединения неравных значений двух столбцов. Чтобы соединить неравные значения, используются те же операторы и предикаты, что и для внутренних соединений. Дополнительные сведения об операторах и предикатах, доступных для использования при соединении неравных значений, см. в разделах Использование операторов в выражениях и Предложение WHERE (Transact-SQL).
В следующем примере используется соединение типа «меньше, чем» (<) для поиска цен сбыта на изделие 718, которые ниже рекомендованных цен на это изделие по прейскуранту.
USE AdventureWorks2008R2;
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)
Соединения с использованием оператора «не равно»
Соединение типа «не равно» (<>) используется редко. Как правило, соединения типа «не равно» имеют смысл только в случаях самосоединения. Например, данное соединение типа «не равно» Transact-SQL и самосоединение используются для поиска подкатегорий с не менее чем двумя различными ценами ниже $15:
USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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