Глава 4
19.
В поле, по которому производится группировка или для которого выполняется
функция.
20.
Выбрав для запроса в режиме конструктора режим SQL из списка кнопки
Режим
(View) в группе
Результаты
(Results).
21.
SELECT
.
22.
Нет.
23.
FROM
.
24.
WHERE
.
25.
Да.
26.
GROUP BY
.
27.
Запятой.
28.
Да.
29.
Between
.
30.
Between #11.01.2012# And #31.03.2013#
31.
Нет.
32.
Сколько видов товара было заказано.
33.
Команда
Итоги
(Totals) на вкладке ленты
Главная
(Home) в группе
Записи
.
Многотабличные запросы на выборку данных
Многотабличный запрос позволяет сформировать записи результата путем объеди-
нения взаимосвязанных записей из таблиц базы данных и выбора из них нужных
полей и записей. Многотабличный запрос часто осуществляет объединение дан-
ных, которые на этапе проектирования были разделены на множество таблиц, отве-
чающих требованиям нормализации. В нормализованных таблицах, прежде всего,
обеспечивалось отсутствие повторяемости описательных данных в базе, там повто-
ряются только значения ключевых полей. В результате выполнения запроса фор-
мируется ненормализованная таблица с повторяющимися данными, в которой каж-
дая запись собирает необходимые данные из разных таблиц.
Например, при объединении двух нормализованных связанных одно-многознач-
ными отношениями таблиц, для которых обеспечивается связная целостность, ре-
зультирующая запись образуется на основе записи подчиненной таблицы, в кото-
рую добавляются поля из связанной записи главной таблицы. Подобное объедине-
ние формирует ненормализованную таблицу, в которой число записей равно числу
записей в подчиненной таблице. При этом данные главной таблицы дублируются
в различных записях результирующей таблицы.
При конструировании многотабличного запроса важнейшим условием является
правильное представление о том, как идет объединение записей таблиц при форми-
ровании результата.
Запросы
177
В Access имеются возможности задать способ объединения записей двух связанных
таблиц как при создании общей схемы базы данных, так и в схеме данных запроса.
Для любой пары связанных таблиц может быть выбран один из трех способов
объединения записей:
способ 1
— объединение только тех записей, в которых связанные поля обеих
таблиц совпадают (выбирается по умолчанию);
способ 2
— объединение тех записей, в которых связанные поля обеих таблиц
совпадают, а также объединение всех записей из первой таблицы, для которых
нет связанных во второй, с пустой записью второй таблицы;
способ 3
— объединение тех записей, в которых связанные поля обеих таблиц
совпадают, а также объединение всех записей из второй таблицы, для которых
нет связанных в первой, с пустой записью первой таблицы.
При установлении связи между таблицами в схеме данных базы по умолчанию вы-
бран первый способ объединения. При обработке таблиц используется этот способ
объединения, если он специально не переопределен.
З
АМЕЧАНИЕ
Если между таблицами в запросе не установлена связь, то для Access остается неиз-
вестным, какие записи связаны с какими, и в запросе формируются все комбинации
записей таблиц, т. е. объединяются все со всеми. Например, если одна таблица со-
держит 10 записей, а другая 4, то в таблице запроса будет 40 записей (10×4). Такое
объединение называется "полное объединение", или "декартово произведение".
Объединение записей в многотабличном запросе
Задача
Рассмотрим технологию конструирования многотабличного запроса на выборку
для решения задачи расчета суммарного количества каждого из товаров, которое
должно быть поставлено покупателям по договорам. В таблице запроса выведем
помимо кода товара также и его наименование. Для реализации такого запроса не-
обходимы таблицы ТОВАР и ПОСТАВКА_ПЛАН, находящиеся в отношении
1 : М. Ранее был создан запрос
Заказано товаров
(см. рис. 4.11 и 4.12), решающий
аналогичную задачу, но каждый из товаров был представлен только своим кодом из
таблицы ПОСТАВКА_ПЛАН. Добавив таблицу ТОВАР, можно для каждого кода
товара получить его наименование. Прежде чем группировать записи для подсчета
суммарного количества каждого из товаров, посмотрим, как образуются эти записи
при объединении двух таблиц.
1.
Для создания запроса выполните команду
Конструктор запросов
(Query
Design), расположенную на ленте
Создание
(Create) в группе
Запросы
.
2.
В окне
Добавление таблицы
(Show Table) (см. рис. 4.2) выберите таблицы
ПОСТАВКА_ПЛАН и ТОВАР и добавьте их в запрос.
3.
Закройте окно
Добавление таблицы
(Show Table).
178
Глава 4
4.
В схеме данных запроса будут представлены таблицы ПОСТАВКА_ПЛАН и
ТОВАР, между которыми, в соответствии со схемой данных, автоматически
установлена связь 1 : М по полю
КОД_ТОВ
с обеспечением целостности.
З
АМЕЧАНИЕ
Если в схеме данных не определена связь между таблицами, но таблицы имеют поля
с одинаковым именем и одинаковым типом данных, Access может автоматически ус-
тановить эту связь. Связи, которые не были установлены Access автоматически, мо-
жет установить пользователь прямо в схеме данных запроса, перетащив задейство-
ванные в связи поля из списка полей одной таблицы в список полей другой.
5.
Щелчком мыши выделите линию связи таблиц и нажмите правую кнопку.
В контекстном меню выберите
Параметры объединения
(Join Properties). В от-
крывшемся окне для связываемых таблиц по умолчанию выбран первый способ
объединения (рис. 4.22).
Рис. 4.22.
Окно выбора способа объединения связываемых таблиц
6.
Перетащите в бланк запроса из таблицы ПОСТАВКА_ПЛАН поле
КОД_ТОВ
и
КОЛ_ПОСТ
, а из таблицы ТОВАР — поле
НАИМ_ТОВ
.
З
АМЕЧАНИЕ
В ряде случаев в бланке запроса наряду с именем поля нужно отображать имя соот-
ветствующей таблицы, например, когда поля имеют одинаковые имена в разных таб-
лицах. Для того чтобы в бланке запроса, наряду с именем поля, видеть имя таблицы,
выполните команду
Имена таблиц
(Table Names)
на ленте конструктора в группе
Показать или скрыть
(Show/Hide).
7.
Выполните запрос, щелкнув на кнопке
Выполнить
(Run) или
Режим
(View) на
ленте конструктора запросов в группе
Результаты
(Results). Число записей
в таблице запроса будет равно числу записей в подчиненной таблице
ПОСТАВКА_ПЛАН.
8.
Если для связи таблиц не было задано параметра обеспечения целостности дан-
ных, в таблицу ПОСТАВКА_ПЛАН можно было бы включить записи с кодами
товара, не содержащимися в таблице ТОВАР. Но такие записи не были бы
включены в таблицу запроса, т. к. первый способ объединения требует наличия
Запросы
179
связанных записей в таблице ТОВАР. Таким образом, по ряду товаров необхо-
димые сведения были бы потеряны.
9.
Снова откройте для связи таблиц окно
Параметры объединения
(Join
Properties) (см. рис. 4.22) и выберите второй способ объединения записей.
Обратите внимание — на линии связи появилась стрелка, направленная от
таблицы ТОВАР к таблице ПОСТАВКА_ПЛАН (рис. 4.23). Она указывает на
необходимость включения в таблицу запроса и тех записей из таблицы ТОВАР,
для которых нет связанных в таблице ПОСТАВКА_ПЛАН.
Рис. 4.23.
Схема данных запроса
при объединении таблиц вторым способом
Рис. 4.24.
Результат объединения таблиц ТОВАР
и ПОСТАВКА_ПЛАН вторым способом
10.
Выполните запрос. При объединении таблиц вторым способом к записям, по-
лученным первым способом, добавились записи из таблицы ТОВАР, не имею-
щие связанных записей в таблице ПОСТАВКА_ПЛАН. Каждая такая запись
дополнена полями
Количество
и
Код товара
из таблицы ПОСТАВКА_
ПЛАН, которые содержат значения
Null
. Такая ситуация возникает вследствие
того, что в плане отсутствуют заказы на ряд товаров. На рис. 4.24 показаны три
записи с пустыми значениями в полях с количеством и кодом товара.
О
БРАТИТЕ ВНИМАНИЕ
Null
— это константа, которая означает, что поле не содержит данных. Поле получает
значение
Null
, когда неизвестно его содержимое. Такое поле не следует путать с по-
лем, содержащим пустую строку, хотя выглядят они одинаково. Значение
Null
можно
ввести в поле или использовать в выражениях и запросах для указания отсутствую-
щих или неизвестных данных. Пустая строка служит для указания того, что строковое
значение для этого поля отсутствует. Для ввода пустой строки с клавиатуры следует
ввести два символа прямых кавычек без пробела (
""
).
180
Do'stlaringiz bilan baham: |