
- •Цель работы: изучение методов создание связей и объединений в запросах.
- •Работа в окне конструктора таблиц
- •Изменение размера верхней части окна конструктора запросов
- •Перемещение макетов таблиц
- •Просмотр имен таблиц
- •Ограничения в многотабличных запросах
- •Ограничения, накладываемые на обновление записей
- •Советы по созданию обновляемых полей в запросах
- •Связывание таблиц
- •Удаление связей
- •Типы связей между таблицами
- •Внутренние объединения
- •Изменение свойств связи
- •Создание левого внешнего объединения
Типы связей между таблицами
Между таблицами и запросами можно установить следующие типы связей.
• Один-к-одному
• Один-ко-многим
• Многие-к-одному
• Многие-ко-многим
При создании связи между таблицами устанавливаются только правила связывания, но не способ просмотра данных на основе этой связи.
Для просмотра данных в двух таблицах следует объединить их общим полем (или группой полей) в обеих таблицах. Такой метод связывания таблиц называется объединением (joining). В запросах таблицы с установленными связями соединены линиями. Внутри запроса можно создать новые связи или изменить существующие. Ниже вы узнаете о следующих типах объединений.
• Внутренние объединения
• Внешние объединения
• Самообъединения
• Перекрестные (декартовы) объединения
Внутренние объединения
В Асееве по умолчанию принято объединение, которое называется равным, или внутренним. Оно указывает Асееss, что вы хотите выбрать все записи из обеих таблиц, которые имеют одинаковые значения в связанных полях.
В руководстве пользователя Ассезз на объединение, принятое по умолчанию, ссылаются как на равное объединение (в теории реляционных баз данных его обычно называют). Эти термины взаимозаменяемы и будут использоваться в этой главе.
Например, вспомним таблицы Customer и Pets. Имейте в виду, что вы ищете все записи из этих таблиц, у которых совпадают поля. Поля Customer Number являются общими для обеих таблиц. Поэтому в результате равного объединения не будут выбраны записи, относящиеся к клиентам, которые не имеют домашних животных, а также записи, относящиеся к домашним животным, которые не имеют реального номера клиента. Правила целостности данных позволяют отсеять записи о тех домашних животных, которые не связаны с номером клиента. Можно, конечно, удалить все записи о домашних животных конкретного клиента или создать запись для нового клиента, в которой не будет записей о домашних животных. Однако всякое домашнее животное всегда должно иметь реального клиента — владельца. Таким образом, условия целостности данных предохраняют поле Customer Number от удаления или изменения, если оно связано с каким-нибудь домашним животным.
Может случиться, что в таблице Customer есть запись о клиенте, не имеющем домашних животных. Маловероятно, но теоретически возможно, существование домашнего животного без реального владельца. При создании запроса для отображения клиентов и их домашних животных каждая запись о клиенте без домашних животных или запись о домашнем животном без владельца не будет показана в итоговом динамическом наборе данных, полученном в результате выполнения запроса.
Иногда нужно выполнить поиск утраченных записей. При этом реализуется одно из преимуществ запроса — способность создавать связи различных типов.
Ассеss может найти утраченные записи, т.е. записи в одной таблице, не имеющие подчиненных записей в другой таблице. В этом случае при создании запроса в окне Новый запрос выберите опцию Записи без подчиненных.
Изменение свойств связи
При объединении таблиц Customer и Pets в них появляются некоторые особенности (или свойства связи). Свойство связи — это правило, которое управляет отображением всех записей (для заданных полей), соответствующих символам поля Customer Number таблицы Customer и поля Customer Number таблицы Pets.
Для разъяснения этого правила рассмотрим, что происходит в таблицах Customer и Pets. .
• Если в таблице Customer есть запись с номером клиента, который не обнаружен в таблице Customer, то эта запись таблицы Customer не будет показана.
• Если в таблице Pets есть запись с номером клиента, который не обнаружен в таблице Customer, то эта запись таблицы Pets не будет показана.
В большинстве случаев эти правила имеют определенный смысл (например, если вы не хотите видеть записей о клиентах, не имеющих домашних животных).
Свойство связи — это правило, которому следует Ассеss при интерпретации любых исключений (а возможно и ошибок) в таблицах (например, должны ли отображаться записи без подчиненных записей).
Ассеss имеет несколько типов объединения с собственными характеристиками. Программа позволяет быстро изменять тип объединения путем изменения его свойств. Для изменения свойств объединения выберите линию связи и дважды щелкните на ней левой кнопкой мыши. На экране появится диалоговое окно Параметры объединения. Диалоговое окно, показанное на рис.9, является результатом выбора линии связи между таблицами Customer и Pets.
В диалоговом окне Параметры объединения есть три переключателя, которые для таблиц Customer и Pets предстают в следующем виде.
1. Объединение только тех записей, в которых связанные поля обеих таблиц совпадают.
Объединение всех записей из Customer и только тех записей из Pets ,в которых связанные поля совпадают,
Объединение всех записей из Pets и только тех записей из Customer, в которых связанные поля совпадают.
Рис.9. Диалоговое окно Параметры объединения
Первый вариант обычно называют внутренним объединением, а два следующих— внешними. Эти объединения управляют Асееss при построении динамического набора данных текущего запроса.
Внутренние и внешние объединения
Предположим, что в верхней части окна конструктора запросов находятся две таблицы — Pets и Customer.
Отображение внутреннего объединения
Для отображения внутреннего объединения выполните следующие действия. В бланке запроса выберите поля Customer Number и Customer Name из таблицы Customer, а также поля Реt Name и Туре оf Аnimal — из таблицы Pets. Перейдите в режим таблицы, щелкнув на соответствующей кнопке панели инструментов, и на экран будет выведен динамический набор данных. Строки и столбцы таблицы будут выглядеть так, как на рис.10, показывая записи о каждом клиенте, клички и типы животных этого клиента. Прокрутите все записи.
Заметьте, что каждая из 129 записей имеет значения во всех четырех полях. Это значит, что каждая запись таблицы Customer имеет соответствующую запись (или записи) в таблице Pets .
Вернитесь в режим конструктора запроса, щелкнув на кнопке Конструктор, расположенной на панели инструментов. Если вы дважды щелкнете на линии связи между таблицами Customer и Pets, то увидите, что для этих двух таблиц задан первый тип объединения из показанных в диалоговом окне Параметры объединения (см. рис.9). Это внутреннее (или равное) объединение используется чаще всего.
Создание правого внешнего объединения
В отличие от равного (внутреннего) объединения, внешнее объединение используется для отображения всех записей одной из таблиц и общих записей — из другой. Линия объединения сообщает вам: "Показать все записи из главной таблицы (с концом линии без стрелки) и только подходящие записи из таблицы, на которую указывает стрелка". Для более детального изучения этого вопроса выполните следующие действия.
1. Вернитесь в окно конструктора запросов и снова дважды щелкните на линии связи между таблицами Customer и Pets.
2. В диалоговом окне Параметры объединения выберите второй переключатель. В результате будут выбраны все записи из таблицы Customer и только те записи из таблицы Pets, для которых связанные поля равны. Затем щелкните на кнопке ОК. Обратите внимание, что линия связи теперь имеет стрелку на одном из концов и указывает на таблицу Pets. В терминологии баз данных это называется правым внешним объединением.
Для отображения этого динамического набора данных щелкните на кнопке Режим таблицы. На первый взгляд, все выглядит так, как и прежде. А теперь прокрутите полученную таблицу вниз и взгляните на запись под номером 63. Вы увидите, что в поле Customer Number находится значение 10003, а в поле Custome Name — имя Саг1а 1опеs. Однако поля Pet Name и Туре оf Аnimal будут пусты (рис.11). Эта запись появилась в результате выбора такого свойства объединения, которое включает все записи из таблицы Customer.
Рис.11. Таблица данных, подученная в результате правого внешнего объединения
В отличие от равных объединений, внешние объединения показывают все связанные записи в таблицах и записи, которые не имеют подчиненной записи в другой таблице. В предыдущем примере вы видели запись о Саг1а Jопеs, но ни одной записи о ее домашних животных не было.
Если после добавления таблиц в окно конструктора запроса вы изменили порядок отображения таблиц, Ассеss не будет следовать этому порядку, а будет использовать первоначальный порядок, в котором вы выбирали таблицы. Если в каждой из таблиц содержится одна и та же информация, то совершенно не важно, какое поле будет выбрано первым.
Для возвращения в окно конструктора запроса щелкните на кнопке Конструктор панели инструментов. Ассеss при создании внешнего объединения для таблиц Customer и Pets изменит внешний вид линии связи, поместив стрелку на одном из ее концов. Как показано на рис.12, стрелка указывает на таблицу Pets. Это значит, что Ассеss создала внешнее объединение и, следовательно, покажет все записи из таблицы Customer и только подходящие записи из таблицы Pets.
Рис.12. Окно конструктора запросов с выбранным правым внешним объединением