Екзотичні об’єднання

Практично всі обєднання базуються на умови рівності первинного ключа головної таблиці і зовнішнього ключа підпорядкованої, саме тому внутрішнє обєднання іноді називають обєднанням рівності Однак така популярність обєднань на основі рівності абсолютно не заперечує цінності та інших умов

Умова обєднання ON насправді є нічим іншим, як умовою WHERE, обмежуючим твір двох поєднуваних наборів даних Пропозиції WHERE можуть бути досить гнучкими і ефективними, однак те ж можна сказати і про умови обєднання Доказом тому є можливість використання наступних технологій: тета-обєднань, обєднань з безліччю умов і неключових обєднань

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

Тета-обєднання (що позначаються грецькою буквою 0) – це обєднання, засновані на умовах нерівності У реляційній теорії все умовні оператори (=, <, <=,>,> = і <>) називають 0-операторами Незважаючи на те що з теоретичної точки зору умови рівності також використовують 0-оператор, в теорії баз даних тільки обєднання, які використовують у своїх умовах інші оператори, називають ©-обєднаннями

0-умову можна створити в конструкторі запитів Management Studio за допомогою діалогового вікна властивостей обєднання (див рис 97)

0-обєднання часто комбінують з безліччю умовних обєднань, що використовують неключові стовпці У всіх подальших прикладах цієї глави ми будемо використовувати 0-обєднання

Обєднання з безліччю умов

Якщо обєднання – це не що інше, як умова скріплення двох наборів даних, то має сенс використовувати в них безліч умов На практиці обєднання з безліччю умов йдуть рука об руку з 0-обєднаннями без можливості використовувати перші другий практично втратили б своє значення

Умови обєднання можуть посилатися на будь-яку таблицю, перераховану в реченні FROM, і це дозволяє створювати цікаві тристоронні обєднання Наведемо приклад:

SELECT *

From А JOIN В

ON Acol = Вcol JOIN З

ON Вcol = Сcol AND Acol = Ccol

Неключові обєднання

Обєднання не обмежені тільки первинними і зовнішніми ключами – в них можна зіставляти рядки двох наборів даних з будь-яких стовпцях, зрозуміло, якщо ці стовпці мають сумісні типи даних

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

SELECT ODOrderlD, ODProductID, POPOID FROM OrderDetail OD

JOIN PurchaseOrder PO

ON ODProductID = POProductID

AND ODDateRequired &gt PODateExpected

При роботі з внутрішніми обєднаннями неключові умови можна помістити в пропозицію WHERE або JOIN Так як ці умови порівнюють аналогічні значення двох повязаних таблиць, я найчастіше розміщую ці умови в частину JOIN пропозиції FROM, а не в пропозицію WHERE Основна відмінність між цими підходами криється в тому, як саме ви розглядаєте це умова: як елемент створення набору даних, з яким працюватиме інша частина інструкції SELECT, або як фільтр для задач, які слідують за пропозицією FROM У кожному разі оптимізований план запиту буде ідентичним, тому ви вільні використовувати будь-який метод, який вам здасться більш читабельним і логічним Слід ще раз відзначити, що при створенні зовнішніх обєднань приміщення умов у пропозиції JOIN і WHERE дає різні результати, що й було продемонстровано в розділі, присвяченому зовнішнім обєднанням

Якщо подивитися на навчальну базу даних Family, то ви побачите, що відповідь на питання’ Хто є близнюками Використовує всі три екзотичних типу обєднання Умова обєднання по полю Mot he г ID, хоча і використовує зовнішній ключ, є нестандартним, оскільки повязано ще з одним зовнішнім ключем Умова DateOfBirth за визначенням є неключових Умова WHERE DateOfBirth is not null видаляє з запиту тих,

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

SELECT PersonFirstName + 1 + PersonLastName,

TwinFirstName + 1 + TwinLastName as Twin,

PersonDateOfBirth FROM dboPerson

JOIN dboPerson Twin

ON PersonPersonID &lt&gt TwinPersonID AND PersonMotherID = TwinMotherlD AND PersonDateOfBirth = TwinDateOfBirth WHERE PersonDateOfBirth IS NOT NULL

Далі описаний той же запит, але на цей раз з екзотичним умовою обєднання, переміщеним в пропозицію WHERE Не дивно, що оптимізатор SQL Server для обох запитів створить ідентичний план виконання:

SELECT PersonFirstName + + PersonLastName AS Person,

TwinFirstName + 1 + TwinLastName as Twin,

PersonDateOfBirth FROM dboPerson

JOIN dboPerson Twin

ON PersonMotherlD = TwinMotherlD

AND PersonDateOfBirth = TwinDateOfBirth WHERE PersonDateOfBirth IS NOT NULL AND PersonPersonID 1= TwinPersonID

Результат буде наступним:

Person           Twin                               DateOfBirth

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

У навчальній базі Northwind, що поставляється компанією Microsoft, неключових обєднання може бути створене шляхом порівняння значень стовпців Region таблиць Customers, Shippers і Orders

Складні сценарії запитів, наведені в кінці цієї глави, також продемонструють екзотичні обєднання, часто використовувані з підзапитами

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*