Внешнее соединение (OUTER JOIN)




Оператор JOIN

Оператор JOIN реализует реляционную операцию соединения на основе предикатного правила. Само правило может иметь простой или сложный вид на основе композиции простых предикатных правил. Наиболее распространенным и практически значимым является, так называемое, эквисоединение, реализуемое бинарной операцией равенства атрибутов «=». Эквисоединение используется для восстановления без потери информации данных таблиц, подвергшихся процедуре нормализации и применения к ним операции проекции. Другие возможные варианты простых предикатов реализуются через операции: «<», «<=», «<>», «=>», «>».В общем случае не накладывается ограничение на именование столбцов соединяемых таблиц. Использование одинаковых имен столбцов первичного и внешнего ключа в связанных таблицах делает процесс управления данными более удобным и является рекомендуемой практикой. Несмотря на то, что фактические связи, реализованные с помощью создания ограничений PRIMARY KEY и FOREIGN KEY, не обязательны, для того чтобы результаты были значимыми, необходимо, чтобы по крайней мере один столбец в каждой из таблиц имел одно и то же значение (имеется ввиду наиболее распространенный случай – эквисоединение) [1].

Если применяемый в запросе столбец с одним и тем же именем встречается в нескольких таблицах, в списке выбора или при перечислении столбцов в предложении WHERE и других предложения инструкции SELECT, следует указывать имя столбца вместе с именем таблицы. Например, столбец Name есть в таблицах Product, Employee и Buyer. Если вы пишите запрос, соединяющий эти таблицы, и хотите включить столбец Name в список выбора или в другую часть запроса, необходимо задавать столбцы как Employee.Name и т.д. Для того чтобы избавится от длинного программного кода из-за длинных имен схемы и объектов, можно применять псевдонимы имен таблиц. В следующем примере показано использование псевдонимов.

SELECT B.BillID,

BU.Name AS BuyerName,

E.Name AS EmployeeName

FROM Bill AS B JOIN Employee AS E ON B.EmployeeID = E.EmployeeID

LEFT JOIN Buyer AS BU ON BU.BuyerID = B.BuyerID

Результатом запроса является выборка фамилий покупателя и работника магазина для каждой сделки. При этом фамилия покупателя выводится только в случае, когда она была указана в сделке (соединение LEFT JOIN). В противном случае выводится значение NULL.

При определении условия оператора JOIN необходимо задать таблицы, которые будут соединяться, тип соединения и условие соединения, формируемого из столбцов

Существуют несколько типов соединения.

 

Внутреннее соединение (INNER JOIN)

Внутренние соединения возвращают только те строки, которые удовлетворяют условию соединения. Несмотря на то, что внутреннее соединение может быть приведено как в предложении FROM, так и предложении WHERE, рекомендуется задавать оператор JOIN в предложении FROM [1].

Следующий пример возвращает дату покупки и идентификатор чека из таблицы Bill (чек), идентификатор записи чека, идентификатор товара, количество купленных товаров, дату записи чека и стоимость из таблицы BillItem (записи чека). В этом примере псевдонимы применяются не только для имен таблиц, но и для имен столбцов, связано это с тем, что в обеих таблицах имеются столбцы DateTime и BillID. Обратите внимание на то, для остальных столбцов не требуются полные имена, поскольку их имена уникальны в обеих таблицах.

SELECT B.BillID,

B.Date AS BillDT,

BillItemID,

ProductID,

Number,

Cost,

BI.Date AS BillItemDT

FROM Bill AS B INNER JOIN BillItem AS BI ON B.BillID = BI.BillID

Поскольку заданно внутреннее соединение, строки из таблицы Bill, не имеющие соответствия в таблице BillItem, не возвращаются. Для преодоления такого поведения следует применять оператор OUTER JOIN.

 

Внешнее соединение (OUTER JOIN)

Внешнее соединение может применяться для возврата всех строк из одной таблицы и данных из строк второй таблицы, имеющих соответствие строкам первой, или для возврата всех строк из всех таблиц, заданных в предложении JOIN. Слово OUTER может быть пропущено в синтаксической записи, но обязательно следует указать LEFT, RIGHT или FULL [1]. Следует помнить, что использование внешних соединений определяет однозначный порядок соединения таблиц. Если аналогичный результат может быть получен с использованием внутренних соединений, рекомендуется отказаться от использования внешних.

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

SELECT B.BillID,

B.Date,

BU.Name

FROM Bill AS B LEFT JOIN Buyer AS BU ON B.BuyerID = BU.BuyerID

 

SELECT B.BillID,

B.Date,

BU.Name

FROM Buyer AS BU RIGHT JOIN Bill AS B ON BU.BuyerID = B.BuyerID

Оператор FULL OUTER JOIN отображает каждую строку обеих таблиц из предложения JOIN. Это может быть полезно для поиска не имеющихся соответствия строк, если в таблицах не реализована реляционная (ссылочная) целостность. Если в столбце соединения есть ограничения в виде внешнего ключа, оператор FULL OUTER JOIN обеспечивает тот же результат, что и оператор LEFT OUTER JOIN с таблицей, в которой внешний ключ определен слева от ключевого слова JOIN. Это объясняется тем, что для соблюдения ограничения у столбца внешнего ключа должна быть соответствующая строка для столбца первичного ключа. Кроме того, когда заданы ограничения внешнего ключа, оператор OUTER JOIN, определенный для таблицы с первичным ключом, заданной как внешняя таблица, обеспечивает те же результаты, что и оператор INNER JOIN.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: