Власні об’єднання

Власними називають такі обєднання, в яких таблиця посилається сама на себе Цей тип відносин часто використовують для отримання даних з поворотних (також званих рекурсивними) звязків Прикладом може служити база даних виробництва будівельних матеріалів (що випускається матеріал посилається на матеріали своїх компонентів) і база даних співробітників підприємства (начальник посилається на своїх підлеглих) Уявіть собі власне обєднання як таблицю, обєднану з своєї тимчасової копією

Навчальна база даних Family використовує два власних обєднання: між дитиною і кожним з батьків (рис 99) Матері і батьки – теж люди і перераховані в тій же таблиці Вони посилаються на власних батьків і тд Навчальна база даних наповнена пятьма фіктивними поколіннями, які можна використовувати для створення пробних запитів

Puc 99 Діаграма бази даних Family містить два унарних відносини (дитини на батьків) зліва і одне унарное ставлення багато до багатьох (чоловіка до дружини) – праворуч

Ключ до створення власних обєднань лежить у створенні другого заслання на таблицю у вигляді іменованого діапазону або псевдоніма Як тільки таблиця стає доступною в інструкції SELECT в двох іпостасях, функція власного обєднання починає працювати точно так само, як і для будь-якого іншого типу обєднання У наступному прикладі посилання на таблицю dbo Person виконується за допомогою іменованого діапазону Mother .

Наступний запит допоможе виявити дітей Одрі Халлоуей (Audry Hallo way):

USE Family

SELECT PersonPersonID, PersonFirstName,

PersonMotherlD, MotherPersonID FROM dboPerson

JOIN dboPerson Mother

ON PersonMotherID = MotherPersonID WHERE MotherLastName = 1 Halloway

AND MotherFirstName = Audry

У цьому запиті таблиця Person використана двічі Перше посилання без іменованого діапазону повязана з другою посиланням все це обмежена пропозицією WHERE з привязкою до імені Audry Halloway У внутрішньому обєднанні будуть брати участь тільки ті записи, в яких поле MotherlD посилається на записи з імям Одрі Халлоуей Ідентифікатором Одрі є число 6, і запит поверне наступних її дітей:

PersonID FirstName                 MotherlD PersonID

8&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Melanie                          6                           6

7&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Corwin                          6                           6

9&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Dara                              6                           6

10&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp James                             6                           6

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

про дату народження кожної людини

SELECT CONVERT(NVARCHAR(15),PersonDateofBirth,1) AS Date,

PersonFirstName AS Name, PersonGender AS G,

ISNULL(FFirstName + + FLastName, * unknown *) as Father,

MFirstName + + MLastName as Mother FROM dboPerson

Left Outer JOIN dboPerson F

ON PersonFatherlD = FPersonID INNER JOIN dboPerson M

ON PersonMotherlD = MPersonID ORDER BY PersonDateOfBirth

Цей запит створює три посилання на таблицю Person: на дитину, на батька і матір У результаті виходить більш інформативний лістинг:

Date

Name

G

Father

Mother

5/19/22

James

M

James Halloway

Kelly Halloway

8/05/28

Audry

F

Bryan Miller

Karen Miller

8/19/51

Melanie

F

James Halloway

Audry Halloway

8/30/53

James

M

James Halloway

Audry Halloway

2/12/58

Dara

F

James Halloway

Audry Halloway

3/13/61

Corwin

M

James Halloway

Audry Halloway

3/13/65

Cameron

M

Richard Campbell

Elizabeth Campbell

Джерело: Нільсен, Пол 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>

*

*