Замечание
"Согласованные типы" в большинстве случаев означают одинаковые типы. Исключением является поле типа Счетчик, которое может иметь размер Длинное целое или Код репликации и может связываться с числовыми полями соответствующего размера.
Результатом такого запроса являются все записи, значения связанных полей которых в обеих таблицах совпадают. Другими словами, эквисоединение связывает записи в таблицах отношением равенства значений связывающих полей.
Для создания запроса, объединяющего все записи из одной таблицы, и только те записи из второй, в которых связанные поля совпадают, используют внешнее соединение. В этом случае независимо от того, имеются ли соответствующие записи во второй таблице, все записи первой попадают в результирующее множество запроса.
Если необходимо связать данные любым отношением, кроме отношения равенства, используют соединение по отношению или тэта-соединение). Соединение по отношению не отображается в окне Схема данных(Relationships) и не выводится в окне Конструктора запросов.
Для обозначения внутренних соединений в Access используются зарезервированные слова ANSI SQL INNER JOIN, а для указания внешних соединений — слова LEFT JOIN или RIGHT JOIN. Выражение WHERE <поле1>=<поле2> соответствует внутреннему соединению, a WHERE поле1>поле2 — соединению по отношению (одному из таких соединений).
Для связывания данных в одной таблице применяют рекурсивное соединение. Оно создается путем добавления в запрос копии таблицы (в результате чего Access назначает псевдоним для копии) и связывания полей идентичных таблиц.
Внутреннее соединение
Внутреннее соединение двух таблиц по одному полю в реляционной базе данных строится на основе отношения "один-ко-многим". Примером может служить демонстрационная база данных "Борей" (Northwind), в которой все соединения являются внутренними соединениями по одному полю на основе указанного отношения. В ходе разработки баз данных, в которых предполагается использование запросов на основе внутренних соединений, придерживайтесь следующих правил.
· Каждая таблица "один" должна иметь первичный ключ с уникальными.значениями. Отсутствие повторений значений поля или полей первичного ключа в таблице Access устанавливает автоматически.
· Отношение "многие-ко-многим" реализуйте на основе промежуточной таблицы, которая связана с каждой из двух таблиц отношением "многие-к-одному". Для обеих связей промежуточная таблица будет находиться со стороны "многие".
· Необходимо извлечь повторяющиеся данные в новую таблицу и связать ее с таблицей, из которой эти данные были получены, отношением "многие-к-одному". Основная цель — однозначно определить извлеченные данные. Часто для этого приходится использовать первичный ключ, состоящий из нескольких полей. Для автоматизации работы по нахождению и извлечению повторяющейся информации можно использовать Мастер по анализу таблиц Microsoft Access. Этот мастер запускается при выборе команды меню Сервис, Анализ, Таблица(Tools, Analysis, Table).
В качестве примера использования запроса на основе внутреннего соединения по одному полю в базе данных "Борей" (Northwind) построим отчет с указанием марки товара, его поставщика, единицы измерения товара и его цены:
1. Если база данных "Борей" открыта, закройте все окна, кроме окна База данных(Database). Если база данных "Борей" не загружена, загрузите ее.
2. Щелкните по ярлыку Запросы(Queries) на панели объектов окна База данных(Database), чтобы открыть список запросов, а затем нажмите кнопку Создать(New) для создания нового запроса. В появившемся диалоговом окне Новый запрос(New Query) выделите элемент Конструктор(Design View) и нажмите кнопкуОК.Access отображает диалоговое окно Добавление таблицы(Show Table) поверх пустого окна запроса.
3. Выберите таблицу "Поставщики" (Suppliers) и добавьте ее в запрос. Access покажет список полей таблицы в верхней панели окна запроса.
4. Добавьте также таблицу "Товары" (Products) и закройте диалоговое окно Добавление таблицы(Show Table). Access добавляет список полей таблицы "Товары" (Products) в окно запроса и изображает соединение полей "КодПоставщика" (SupplierlD) двух таблиц (рис. 4.20). Соединение создается автоматически, т. к. поле "КодПоставщика" является ключевым в таблице "Поставщики" и в таблице "Товары" найдено поле с тем же именем (внешний ключ). Отображаемое отношение является отношением "один-ко-многим".
Рис. 4.20. Окно Конструктора запроса с изображением соединения полей таблиц
5. Выберите поле "Марка" (ProductName) в таблице "Товары" (Products) и перетащите его в строку Поле(Field) первого столбца бланка запроса.
6. Выберите поле "Название" (CompanyName) в таблице "Поставщики" (Suppliers) и перетащите в строку Поле(Field) второго столбца. Также перетащите поля "ЕдиницаИзмерения" (QuantityPerUnit) и "Цена" (UnitPrice) таблицы "Товары" (Products) в строку Поле(Field) третьего и четвертого столбца бланка запроса, соответственно (рис. 4.21).
Рис. 4.21. Бланк запроса с заполненными полями в режиме Конструктора
Нажмите кнопку Запуск(Run) либо выберите Режим таблицы(Query View) в списке кнопки Вид (View) на панели инструментов для отображения результата запроса (рис. 4.22). Обратите внимание на то, что заголовками полей в созданном наборе записей являются подписи полей таблицы (включающие пробелы), а не их имена, в которых пробелы обычно не используются.
Рис. 4.22. Результирующее множество запроса
После выполнения запроса Microsoft Access выводит на экран результирующее множество, записи которого упорядочены по значению первичного ключа (так же, как и при просмотре таблицы). Чтобы изменить порядок сортировки, например, упорядочить записи по убывающей цене товара:
1. Переключитесь в режим Конструктора запроса.
2. Установите курсор в поле Сортировка(Sort) столбца "Цена", а затем нажмите клавишу <F4> или стрелку справа для вывода содержимого списка.
3. Выберите элемент по убыванию(Descending).
4. Нажмите кнопку Запуск(Run) для вывода нового результирующего множества запроса (рис. 4.23).
5. Сохраните запрос, дав ему название: "Отсортированный список товаров".
Рис. 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.
Внешнее соединение
Внешние соединения бывают левыми или правыми. Запрос, в котором участвуют таблицы с левым внешним соединением (LEFT JOIN или *= в SQL), выводит все записи таблицы "один", в независимости от того, имеются ли соответствующие им записи в таблице "многие". И наоборот, запрос, в котором участвуют таблицы с правым внешним соединением (RIGHT JOIN или =* в SQL), выводит все записи таблицы "многие", в независимости от того, имеются ли соответствующие им записи в таблице "один".
Рассмотрим в качестве примера, как с помощью левого внешнего соединения создать запрос в базе данных "Борей" (Northwind), который обнаруживает клиентов, не сделавших ни одного заказа:
1. Создайте новый запрос и добавьте в него таблицы "Клиенты" (Customers) и "Заказы" (Orders). Поскольку эти таблицы связаны отношением "один-ко-многим", между ними сразу появляется соединяющая линия.
2. Выделите и перетащите в бланк запроса поле "Название" (CompanyName) таблицы "Клиенты" и поле "КодЗаказа" (Orderld) таблицы "Заказы".
3. Выполните запрос и посмотрите, сколько записей будет возвращать запрос: 830.
4. Вернитесь в режим Конструктора. Щелкните правой кнопкой мыши на линии, соединяющей таблицы, и выберите из контекстного меню команду Параметры объединения(Join Properties). Появится диалоговое окно, представленное на рис. 4.26. В данном окне показаны имена связанных полей в таблицах. При этом таблица на стороне "один" считается левой (независимо от того, как она расположена в окне Конструктора), а таблица на стороне "многие" — правой. Ниже расположены три переключателя:
o "1" задает внутреннее соединение;
o "2" — левое внешнее соединение;
o "3" — правое внешнее соединение.
Рис. 4.26. Диалоговое окно Параметры объединения
Дата добавления: 2015-06-10; просмотров: 822;