Внутреннее соединение
Внутреннее соединение двух таблиц по одному полю в реляционной базе данных строится на основе отношения "один-ко-многим". Примером может служить демонстрационная база данных "Борей" (Northwind), в которой все соединения являются внутренними соединениями по одному полю на основе указанного отношения. В ходе разработки баз данных, в которых предполагается использование запросов на основе внутренних соединений, придерживайтесь следующих правил.
- Каждая таблица "один" должна иметь первичный ключ с уникальными.значениями. Отсутствие повторений значений поля или полей первичного ключа в таблице Access устанавливает автоматически.
- Отношение "многие-ко-многим" реализуйте на основе промежуточной таблицы, которая связана с каждой из двух таблиц отношением "многие-к-одному". Для обеих связей промежуточная таблица будет находиться со стороны "многие".
- Необходимо извлечь повторяющиеся данные в новую таблицу и связать ее с таблицей, из которой эти данные были получены, отношением "многие-к-одному". Основная цель — однозначно определить извлеченные данные. Часто для этого приходится использовать первичный ключ, состоящий из нескольких полей. Для автоматизации работы по нахождению и извлечению повторяющейся информации можно использовать Мастер по анализу таблиц Microsoft Access. Этот мастер запускается при выборе команды меню Сервис, Анализ, Таблица (Tools, Analysis, Table).
В качестве примера использования запроса на основе внутреннего соединения по одному полю в базе данных "Борей" (Northwind) построим отчет с указанием марки товара, его поставщика, единицы измерения товара и его цены:
- Если база данных "Борей" открыта, закройте все окна, кроме окна База данных (Database). Если база данных "Борей" не загружена, загрузите ее.
- Щелкните по ярлыку Запросы (Queries) на панели объектов окна База данных (Database), чтобы открыть список запросов, а затем нажмите кнопку Создать (New) для создания нового запроса. В появившемся диалоговом окне Новый запрос (New Query) выделите элемент Конструктор (Design View) и нажмите кнопку ОК. Access отображает диалоговое окно Добавление таблицы (Show Table) поверх пустого окна запроса.
- Выберите таблицу "Поставщики" (Suppliers) и добавьте ее в запрос. Access покажет список полей таблицы в верхней панели окна запроса.
- Добавьте также таблицу "Товары" (Products) и закройте диалоговое окно Добавление таблицы (Show Table). Access добавляет список полей таблицы "Товары" (Products) в окно запроса и изображает соединение полей "КодПоставщика" (SupplierlD) двух таблиц (рис. 4.20). Соединение создается автоматически, т. к. поле "КодПоставщика" является ключевым в таблице "Поставщики" и в таблице "Товары" найдено поле с тем же именем (внешний ключ). Отображаемое отношение является отношением "один-ко-многим".
Рис. 4.20. Окно Конструктора запроса с изображением соединения полей таблиц
- Выберите поле "Марка" (ProductName) в таблице "Товары" (Products) и перетащите его в строку Поле (Field) первого столбца бланка запроса.
- Выберите поле "Название" (CompanyName) в таблице "Поставщики" (Suppliers) и перетащите в строку Поле (Field) второго столбца. Также перетащите поля "ЕдиницаИзмерения" (QuantityPerUnit) и "Цена" (UnitPrice) таблицы "Товары" (Products) в строку Поле (Field) третьего и четвертого столбца бланка запроса, соответственно (рис. 4.21).
Рис. 4.21. Бланк запроса с заполненными полями в режиме Конструктора
Нажмите кнопку Запуск (Run) либо выберите Режим таблицы (Query View) в списке кнопки Вид (View) на панели инструментов для отображения результата запроса (рис. 4.22). Обратите внимание на то, что заголовками полей в созданном наборе записей являются подписи полей таблицы (включающие пробелы), а не их имена, в которых пробелы обычно не используются.
Рис. 4.22. Результирующее множество запроса
После выполнения запроса Microsoft Access выводит на экран результирующее множество, записи которого упорядочены по значению первичного ключа (так же, как и при просмотре таблицы). Чтобы изменить порядок сортировки, например, упорядочить записи по убывающей цене товара:
- Переключитесь в режим Конструктора запроса.
- Установите курсор в поле Сортировка (Sort) столбца "Цена", а затем нажмите клавишу <F4> или стрелку справа для вывода содержимого списка.
- Выберите элемент по убыванию (Descending).
- Нажмите кнопку Запуск (Run) для вывода нового результирующего множества запроса (рис. 4.23).
- Сохраните запрос, дав ему название: "Отсортированный список товаров".
Рис. 4.23. Результат запроса с сортировкой по убывающей цене товара
Аналогично создаются запросы, в которых участвует несколько связанных таблиц, образующих цепочку. При этом в результат запроса могут быть включены поля из всех таблиц, участвующих в запросе, или только поля из таблиц, находящихся на концах такой цепочки (рис. 4.24). Во втором случае таблицы на концах цепочки оказываются связанными косвенно, и чтобы правильно построить запрос, соединяющий поля этих таблиц, необходимо включить в запрос каждую таблицу, участвующую в соединении. Например, можно вывести названия стран, товары из которых покупаются клиентами. В данном случае косвенно оказываются связанными таблицы "Клиенты" (Customers) и "Поставщики" (Suppliers), а промежуточными таблицами оказываются таблицы "Заказы" (Orders), "Заказано" (Order Details), "Товары" (Products). Microsoft Access автоматически показывает связи, в том числе и промежуточные, между таблицами.
После добавления в бланк запроса полей "Название" (CompanyName) из таблицы "Клиенты" (Customers) и "Страна" (Country) из таблицы "Поставщики" (Suppliers) выберите команду Вид, Режим SQL (View, SQL View) для того, чтобы просмотреть инструкцию SQL, соответствующую данному запросу (рис. 4.25). Соединения таблиц задаются операцией INNER JOIN. . .ON. . . При таком положении косвенные соединения основываются на выражении INNER JOIN ... ON... ON... (Подробнее об инструкциях языка SQL см. разд. "Создание запросов SQL"гл. 8)
Рис. 4.24. Соединение косвенно связанных записей
Рис. 4.25. Эквивалентная запросу инструкция SQL
Запросы, соединяющие косвенно связанные записи, часто используются при анализе данных с помощью статистических функций SQL или перекрестных запросов Access.