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

Иногда возникает проблема, сводящаяся к тому, что итоговый запрос должен содержать несколько полей, ссылающихся на одну и ту же таблицу-справочник. Типичным примером указанной ситуации является документ (накладная) на перемещение товарно-материальных ценностей (ТМЦ) с одного склада предприятия на другой. Принципы построения реляционных баз данных требуют, чтобы в полях ИсходныйСклад и СкладНазначения хранились ссылки на соответствующее поле таблицы-справочника Список складов. Создавая запрос, отображающий позиции всех таких накладных, мы можем одну из ссылок связать с таблицей-справочником Список складов, чтобы в итоговой выборке было представлено не абстрактное число, а, например, полное наименование склада, фамилия материально-ответственного лица и другая соответствующая информация. Однако, если связать с таблицей Список складов и вторую ссылку, то в итоговую выборку попадут только те записи, в которых ИсходныйСклад и Склад Назначения совпадают.

Прежде чем приступить к описанию решения такой проблемы, следует проделать несколько предварительных действий. Перейдите на вкладку Таблицы окна базы данных и создайте две новых таблицы: Список отделов и Список сотрудников по отделам. Первая таблица должна содержать следующие поля: Номер числового типа, размер — длинное целое; Отдел — текстового типа; Начальник — числового типа, размер — длинное целое. Далее перейдите в режим просмотраи введите в таблицу информацию в соответствии с рис. 2.6. Эта таблица будет служить для распределения всех сотрудников по различным отделам.

Вторая таблица, Список сотрудников по отделам, должна содержать два поля — Сотрудник и Отдел. Оба поля должны быть числового типа, размер — длинное целое. Использование этой таблицы является ярким примером того, как можно расширить уже готовую структуру базы данных, при этом, не нарушая ее. С другой стороны, эта таблица является примером применения связей многие-ко-многим, поскольку будет служить для связывания многих записей из таблицы Сотрудники со многими записями из таблицы Список отделов. После окончания конструирования перейдите в режим просмотра и заполните таблицу информацией в соответствии с рис. 2.6.

Рис 2.6. Вспомогательные таблицы Список отделов и Список сотрудников

Далее перейдите на вкладку Запросы окна базы данных и создайте новый запрос, открыв его в режиме конструктора. Добавьте в его макет таблицы Список отделов, Список сотрудников по отделам и таблицу Сотрудники — дважды. Между таблицами создайте следующие связи: между полем Начальник таблицы Список отделов и полем КодСотрудника таблицы Сотрудники; между полем Номер таблицы Список отделов и полем Отдел таблицы Список сотрудников по отделам; между полем Сотрудник таблицы Список сотрудников по отделам и полем КодСотрудника таблицы Сотрудники!.

После этого перетащите в бланк запроса поле Отдел из таблицы Список отделов, в определение второго поля введите текст: Сотрудник: Сотрудники_1.Фамилия & " " & Сотрудники_1.Имя, а в определение третьего — Начальник:Сотрудники.Фамилия & " " & Сотрудники.Имя. В заключение установите для первых двух полей сортировку По возрастанию. Получившийся запрос представлен на рис. 2.7.

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

Пояснения

а). Если из бланка запроса (см. рис. 2.7) удалить копию таблицы Сотрудники и связать поля Начальник таблицы Список отделов и Сотрудник таблицы Спи сок сотрудников по отделам с полем КодСотрудника таблицы Сотрудники, то в итоговой выборке будет только список руководителей отделов. Действительно, установленные таким образом связи подразумевают, что отбираться будут только те записи из трех таблиц, в которых значения всех трех полей совпадают. Получается замкнутый круг. Чтобы разорвать этот круг и применяются копии таблиц. В описываемом примере существует одно лишнее поле, для которого в макет запроса была добавлена одна копия таблицы. Если в запросе будет два лишних поля — то нужно будет использовать две копии таблицы, и т.д.

б). Вспомогательная таблица Список сотрудников по отделам используется для создания связи типа многие-ко-многим между таблицами Список отделов Сотрудники. В таких таблицах обычно содержатся исключительно ключевые поля связываемых таблиц.

в) В приведенном примере для связывания всех таблиц использовались временные связи.

г) Обратите внимание на то, как в строке оператора SQL в предложении FROM вводится копия таблицы Сотрудники:

Сотрудники AS Сотрудники_1

Эта конструкция указывает на то, что далее в операторе SQL имя Сотрудники_1 будет употребляться как синоним имени таблицы Сотрудники. Такие конструкции могут применяться не только в описываемом здесь случае. В частности, если в запросе используются длинные наименования таблиц, то можно в предложении FROM для каждой такой таблицы указать синоним, состоящий всего из одной или нескольких букв, и дальше пользоваться исключительно синонимами. Обычно этим пользуются в СУБД, где приходится вводить текст оператора SQL вручную (нет такого удобного средства как конструктор запросов), или существуют серьезные ограничения на длину SQL-оператора.


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



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