Запрос, использующий связь таблицы с самой собой (рекурсивное соединение)

Допустим, нужно получить выборку сотрудников, заказов и клиентов, для которых дата размещения заказов совпадает с датой исполнения за 1998 год. Для этого откройте новый запрос в режиме конструктора и добавьте в него таблицы Заказы и Сотрудники, причем Заказы — два раза. В результате система автоматически присвоит для копии таблицы Заказы имя Заказы_1. К уже имеющейся постоянной связи между таблицами Заказы и Сотрудники нужно добавить связь между таблицами Заказы и Заказы_1 по полям ДатаРазмещения и ДатаИсполнения. Такая связь называется рекурсивным соединением. Для того чтобы запрос работал правильно, нужно также добавить связь по полям КодЗаказа таблиц Заказы и Заказы_1.

В первое поле бланка запроса введите определение: Сотрудник: [Фамилия] & " " & [Имя] и добавьте поля Должность из таблицы Сотрудники и КодЗаказа, КодКлиента и Дата Размещения из таблицы Заказы. Для полей Сотрудник и Дата Размещения установите порядок сортировки по возрастанию и для поля ДатаРазмещения укажите условие: Between #01.01.98# And #31.12.98#. Полученный запрос изображен на рис. 2.5.

 
 

 
 

 
 

Рис 2.5. Запрос, использующий рекурсивное соединение таблиц.

Пояснения

а). При построении этого запроса есть один тонкий момент, незнание которого может привести к получению ошибочной итоговой выборки. Если между таблицами Заказы и Заказы_1 будет только одна связь по полям ДатаРазмещения и ДатаИсполнения,, то будут выбираться те записи, в которых оба поля совпадают, в том числе и для совершенно разных заказов.

Для того чтобы ограничиться заказами, для каждого из которых поля ДатаРазмещения и Дата Исполнения имеют одинаковые значения, нужно связать также поля КодЗаказа таблиц Заказы и Заказы_1.

б). Изначально таблица Заказы учебной базы данных Борей не имеет ни одной записи, содержащей одинаковые значения в полях ДатаРазмещения и ДатаИсполнения. Для того чтобы продемонстрировать способ использования рекурсивной связи, пришлось вручную подкорректировать даты одной из записей.

Если добавить в бланк запроса сначала дважды таблицу Заказы и затем — Сотрудники, то конструктор также автоматически свяжет таблицу Сотрудники с копией таблицы Заказы — Заказы_1 по полю КодСотрудника. Эта связь лишняя и ее нужно убрать. Если добавлять в макет запроса таблицы в обратной последовательности, то лишняя связь создана не будет.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: