Наиболее часто запросы на выборку используются для того, чтобы объединить в одной таблице на экране данные, которые реально размещаются в разных таблицах базы данных.
Наиболее часто запросы на выборку используются для того, чтобы объединить в одной таблице на экране данные, которые реально размещаются в разных таблицах базы данных. Источниками данных в таких запросах являются связанные таблицы. Как связываются таблицы в базе данных, вы уже знаете (см. Занятие 3). Когда запрос создается на базе нескольких таблиц, говорят, что эти таблицы объединяются в запросе. Причем можно использовать несколько видов объединений. Наиболее распространенным является внутреннее объединение. При этом в результирующий набор попадают те записи из двух связанных таблиц, у которых связанные поля совпадают. Если две таблицы связаны отношением "один-ко- многим", то в результат запроса включаются все записи из главной таблицы (таблицы "один"), для которых имеются соответствующие записи в подчиненной таблице (таблице "многие"). Если запись в главной таблице не имеет соответствующих записей в подчиненной таблице, эта запись в результирующее множество не включается. Подобного рода объединение таблиц в запросе Access создает автоматически, когда:
соединение "один-ко-многим" было явно задано в окне Схема данных (Rela<->tionships);
в таблицах имеются поля с одинаковыми именами и согласованными типами, причем одно из полей является ключевым.
Именно такое объединение таблиц использовалось в тех запросах, которые мы создавали на прошлом занятии. Чтобы понять, как работает внутреннее объединение, предлагается сделать такое упражнение.
Согласованные типы -- в большинстве случаев означают одинаковые типы. Исключением является поле типа Счетчик, которое может иметь размер Длинное целое и связываться с числовыми полями, имеющими тот же размер: Длинное целое.
Откройте таблицу Издания в режиме таблицы и внесите в нее книгу, которая не имеет автора, например, Русские былины.
После ввода всех полей не забудьте перейти на следующую запись, чтобы введенные данные сохранились в таблице. Убедитесь, что значок с карандашиком исчез из области выделения введенной записи.
Закройте таблицу Издания.
Откройте запрос Книги по авторам, который мы создали на прошлом занятии, в режиме Конструктора.
Удалите все введенные ранее условия выборки.
Выполните запрос, переключившись в режим таблицы.
Щелкните на любой записи в столбце Название и нажмите кнопку Найти (Find) на панели инструментов.
В диалоговом окне Поиск и замена (Find) в поле Образец (Find What) введите слово былины (рис. 6.26).
В поле Совпадение (Match) установите значение С любой частью поля (Any Part of Field). (Можете еще нажать кнопку Больше (More) и убедиться, что просмотр будет вестись во всех направлениях.)
Рис. 6.26. Диалоговое окно Поиск и замена
Нажмите кнопку Найти далее (Find Next). Вы получите сообщение о том, что запись не найдена.
Действительно, новая запись в таблице Издания не имеет связанных записей в подчиненной таблице АвторИздание, а также записей в таблице Авторы. Поэтому она не попадает в результат запроса. Таким образом, наш запрос построен не совсем корректно. (Именно эта ошибка может быть причиной "исчезновения" записей в ваших таблицах во многих случаях.) Чтобы устранить ошибку, нужно использовать так называемое внешнее объединение. Внешние объединения бывают левыми или правыми. Запрос, в котором участвуют таблицы с левым внешним объединением (в инструкции SQL оно обозначается LEFT JOIN), выводит все записи таблицы "один" с уникальным значением первичного ключа в независимости от того, имеются ли соответствующие им записи в таблице "многие". И наоборот, запрос, в котором участвуют таблицы с правым внешним объединением (в инструкции SQL RIGHT JOIN), выводит все записи таблицы "многие" в независимости от того, имеются ли соответствующие им записи в таблице "один". Теперь мы установим внешнее объединение между таблицами в запросе Книги по авторам.
Переключитесь в режим Конструктора.
Выделите связь между таблицами Издания и АвторИздание и затем дважды щелкните на ней.
Появится диалоговое окно Параметры объединения (Join Properties) (рис. 6.27). Значение переключателя 1 задает обычное внутреннее объединение, значение 2 ? левое вне шнее объединение, а значение 3 ? правое внешнее объединение.
Задайте левое внешнее объединение, выбрав значение переключателя 2. Нажмите кнопку OK для закрытия диалогового окна. При этом на конце линии соединения появится стрелка в сторону таблицы "многие" (АвторИздание), что указывает на левое внешнее объединение (рис. 6.28).
Рис. 6.27. Диалоговое окно Параметры объединения
Поскольку в нашей базе данные таблиц Издания и Авторы связаны косвенно, через таблицу связи АвторИздание, постольку, чтобы правильно был создан запрос, необходимо установить внешнее объединение и между таблицами Авторы и АвторИздание. Только теперь нужно, чтобы в запрос были включены все записи из таблицы АвторИздание ("многие") и только те записи из таблицы Авторы, которые имеют совпадающие значения в связанных полях. Это будет правое внешнее объединение.
Рис. 6.28. Отображение левого внешнего объединения в запросе
Щелкните дважды на линии, соединяющей таблицы Авторы и АвторИздание, открывая тем самым диалоговое окно Параметры объединения (Join Properties).
Выберите значение переключателя 3 и нажмите кнопку ОК. Стрелочка теперь будет указывать в сторону таблицы на стороне "один" (Авторы). Окончательный вид запроса должен быть такой, как представлен на рис. 6.29.
Рис. 6.29. Отображение внешнего объединения между таблицами, связанными косвенно
Выполните запрос и убедитесь, что книга "Русские былины" появилась в результирующем наборе запроса.