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

0

Собственными называют такие объединения, в которых таблица ссылается сама на себя. Этот тип отношений часто используют для извлечения данных из возвратных (также называемых рекурсивными) связей. Примером может служить база данных производства строительных материалов (выпускаемый материал ссылается на материалы своих компонентов) и база данных сотрудников предприятия (начальник ссылается на своих подчиненных). Представьте себе собственное объединение как таблицу, объединенную со своей временной копией.

Учебная база данных Family использует два собственных объединения: между ребенком и каждым из родителей (рис. 9.9). Матери и отцы — тоже люди и перечислены в той же таблице. Они ссылаются на собственных родителей и т.д. Учебная база данных наполнена пятью фиктивными поколениями, которые можно использовать для создания пробных запросов.

Puc. 9.9. Диаграмма базы данных Family содержит два унарных отношения (ребенка на родителей) слева и одно унарное отношение “многие ко многим ” (мужа к жене) — справа

Ключ к созданию собственных объединений лежит в создании второй ссылки на таблицу в виде именованного диапазона или псевдонима. Как только таблица становится доступной в инструкции SELECT в двух ипостасях, функция собственного объединения начинает работать точно так же, как и для любого другого типа объединения. В следующем примере ссылка на таблицу dbo. Person выполняется с помощью именованного диапазона ‘ Mother ‘.

Следующий запрос поможет выявить детей Одри Халлоуэй (Audry Hallo way):

USE Family

SELECT Person.PersonID, Person.FirstName,

Person.MotherlD, Mother.PersonID FROM dbo.Person

JOIN dbo.Person Mother

ON Person.MotherID = Mother.PersonID WHERE Mother.LastName = 1 Halloway’

AND Mother.FirstName = ‘Audry’

В этом запросе таблица Person использована дважды. Первая ссылка без именованного диапазона связана со второй ссылкой; все это ограничено предложением WHERE с привязкой к имени Audry Halloway. Во внутреннем объединении будут участвовать только те записи, в которых поле MotherlD ссылается на записи с именем Одри Халлоуэй. Идентификатором Одри является число 6, и запрос вернет следующих ее детей:

PersonID FirstName                 MotherlD PersonID

8              Melanie                          6                           6

7              Corwin                          6                           6

9              Dara                              6                           6

10           James                             6                           6

Несмотря на то что приведенный выше запрос вполне адекватно продемонстрировал собственное объединение, более полезно было бы, если бы имя матери не было строго запрограммировано в предложении WHERE и было предоставлено больше информации, в частности

о          дате рождения каждого человека.

SELECT CONVERT(NVARCHAR(15),Person.DateofBirth,1) AS Date,

Person.FirstName AS Name, Person.Gender AS G,

ISNULL(F.FirstName + ‘ ‘ + F.LastName, ‘* unknown *’) as Father,

M.FirstName + ‘ ‘ + M.LastName as Mother FROM dbo.Person

Left Outer JOIN dbo.Person F

ON Person.FatherlD = F.PersonID INNER JOIN dbo.Person M

ON Person.MotherlD = M.PersonID ORDER BY Person.DateOfBirth

Этот запрос создает три ссылки на таблицу 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 с. : ил. — Парал. тит. англ.

По теме:

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