Главная » Microsoft SQL Server, Базы данных » Экзотические объединения

0

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

Условие объединения ON в действительности является ничем иным, как условием WHERE, ограничивающим произведение двух объединяемых наборов данных. Предложения WHERE могут быть достаточно гибкими и эффективными, однако то же можно сказать и об условиях объединения. Доказательством тому является возможность использования следующих технологий: тета-объединений, объединений с множеством условий и неключевых объединений.

Тета-объединения (0-объединения)

Тета-объединения (обозначаемые греческой буквой 0) — это объединения, основанные на условиях неравенства. В реляционной теории все условные операторы (=, <, <=, >, >= и <>) называют 0-операторами. Несмотря на то что с теоретической точки зрения условия равенства также используют 0-оператор, в теории баз данных только объединения, использующие в своих условиях другие операторы, называют ©-объединениями.

0-условие можно создать в конструкторе запросов Management Studio с помощью диалогового окна свойств объединения (см. рис. 9.7).

0-объединения часто комбинируют со множеством условных объединений, использующих неключевые столбцы. Во всех дальнейших примерах этой главы мы будем использовать 0-объединения.

Объединения с множеством условий

Если объединения — это не что иное, как условие связывания двух наборов данных, то имеет смысл использовать в них множество условий. На практике объединения с множеством условий идут рука об руку с 0-объединениями; без возможности использовать первые вторые практически утратили бы свое значение.

Условия объединения могут ссылаться на любую таблицу, перечисленную в предложении FROM, и это позволяет создавать интересные трехсторонние объединения. Приведем пример:

SELECT *

From А JOIN В

ON A.col = В.col JOIN С

ON В.col = С.col AND A.col = C.col

Неключевые объединения

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

Например, система складского распределения может использовать неключевое объединение для поиска товаров, поступление которых ожидается от поставщика, с целью информирования клиента о сроках доставки. Неключевое объединение между таблицами PurchaseOrder и OrderDetail с 0-условием между полями РО.DateExpected и OD. DateRequired отфильтрует результат объединения только теми товарами, которые могут быть размещены в заказе клиента. В следующем примере продемонстрировано данное неключевое объединение (его нет в учебной базе данных):

SELECT OD.OrderlD, OD.ProductID, PO.POID FROM OrderDetail OD

JOIN PurchaseOrder PO

ON OD.ProductID = PO.ProductID

AND OD.DateRequired > PO.DateExpected

При работе с внутренними объединениями неключевые условия можно поместить в предложение WHERE или JOIN. Так как эти условия сравнивают аналогичные значения двух связанных таблиц, я чаще всего помещаю эти условия в часть JOIN предложения FROM, а не в предложение WHERE. Основное различие между этими подходами кроется в том, как именно вы рассматриваете это условие: как элемент создания набора данных, с которым будет работать остальная часть инструкции SELECT, или как фильтр для задач, которые следуют за предложением FROM. В любом случае оптимизированный план запроса будет идентичным, поэтому вы вольны использовать любой метод, который вам покажется более читаемым и логичным. Следует еще раз отметить, что при создании внешних объединений помещение условий в предложения JOIN и WHERE дает разные результаты, что и было продемонстрировано в разделе, посвященном внешним объединениям.

Если посмотреть на учебную базу данных Family, то вы увидите, что ответ на вопрос ‘‘Кто является близнецами?” использует все три экзотических типа объединения. Условие объединения по полю Mot he г ID, хотя и использует внешний ключ, является нестандартным, поскольку связано еще с одним внешним ключом. Условие DateOfBirth по определению является неключевым. Условие WHERE DateOfBirth is not null удаляет из запроса тех,

кто вошел в семью через замужество и, таким образом, не имеет зарегистрированных в базе данных родителей:

SELECT Person.FirstName + ‘ 1 + Person.LastName,

Twin.FirstName + 1 ‘ + Twin.LastName as Twin,

Person.DateOfBirth FROM dbo.Person

JOIN dbo.Person Twin

ON Person.PersonID <> Twin.PersonID AND Person.MotherID = Twin.MotherlD AND Person.DateOfBirth = Twin.DateOfBirth WHERE Person.DateOfBirth IS NOT NULL

Далее описан тот же запрос, но на этот раз с экзотическим условием объединения, перемещенным в предложение WHERE. Неудивительно, что оптимизатор SQL Server для обоих запросов создаст идентичный план выполнения:

SELECT Person.FirstName + ‘ ‘ + Person.LastName AS Person,

Twin.FirstName + ‘ 1 + Twin.LastName as Twin,

Person.DateOfBirth FROM dbo.Person

JOIN dbo.Person Twin

ON Person.MotherlD = Twin.MotherlD

AND Person.DateOfBirth = Twin.DateOfBirth WHERE Person.DateOfBirth IS NOT NULL AND Person.PersonID 1= Twin.PersonID

Результат будет следующим:

Person           Twin                               DateOfBirth

Abbie Halloway Allie Halloway 1979-08-14 00:00:00.000 Allie Halloway Abbie Halloway 1979-08-14 00:00:00.000

В учебной базе Northwind, поставляемой компанией Microsoft, неключевое объединение может быть создано путем сравнения значений столбцов Region таблиц Customers, Shippers и Orders.

Сложные сценарии запросов, приведенные в конце настоящей главы, также продемонстрируют экзотические объединения, часто используемые с подзапросами.

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии