Такая выборка данных предполагает соединение нескольких таблиц для получения единого набора результатов, включающих записи и поля каждой таблицы. Соединение позволяет собрать данные, разделенные в процессе нормализации.
Существует три вида соединений: внутреннее, внешнее и перекрестное. Для объединения трех и более таблиц можно применять последовательность соединений.
Для соединения таблиц необходимо раздел FROM дополнить ключевыми словами JOIN, которое определяет соединяемые таблицы и метод соединения, и ON, указывающее общие для таблиц поля.
При таком виде соединения сравниваются значения общих полей двух таблиц, возвращаются только записи, удовлетворяющие критерию связывания в обеих таблицах. Записи, для которых не имеется пары в связанной таблице, в результат не включаются.
Например, в таблице Product нормализованной базы данных AdventureWorks храниться только идентификатор категории товара. Чтобы получить список товаров с указанием их категорий, необходимо соединить таблицы Product и ProductSubcategory:
FROM Production.Product INNER JOIN Production.ProductSubcategory
ON Product.ProductSubcategoryID = ProductSubcategory.ProductSubcategoryID
При таком соединении товары, для которых не указана их категория, не включаются в набор результатов.
Обратите внимание, что в разделе FROM необходимо указать имя схемы Production, а в остальных случаях перед указанием поля используется имя таблицы Product и ProductSubcategory для разрешения конфликтов, т.к. в обеих таблицах присутствуют поля Name.
Такое соединение также возвращает объединенные записи, соответствующие условию объединения. Однако левые и правые соединения возвращают записи и не соответствующие указанному условию объединения. Такие соединения применяются для получения полного набора записей одной из таблиц.
При левом соединении в результат будут включены все записи левой таблицы (имя которой расположено слева от JOIN), независимо от того, есть для них соответствующая запись в правой таблице (имя таблицы расположено справа от JOIN) или нет.
Например, следующий запрос возвращает имя контактного лица и дату размещения заказа:
SELECT FirstName, LastName, OrderDate
FROM Person.Contact LEFT JOIN Sales.SalesOrderHeader
ON Contact.ContactID = SalesOrderHeader.ContactID
Для лиц, не размещавших заказы, в поле OrderDate содержится значение NULL.
При правом соединении (ключевое слово RIGHT JOIN) в результат включаются все записи правой таблицы, независимо от того, есть для них соответствующая строка в левой таблице.
Измените рассмотренный запрос так, чтобы он выдавал такие же результаты при использовании правого соединения.