Создание вычисляемых полей в запросах


Создание запросов интересно не только тем, что вы можете в виде одной таблицы представить данные из нескольких связанных таблиц и отобрать нужные записи из этих таблиц. Вы можете создавать столбцы в запросе, которые являются результатом вычислений над значениями других столбцов. Такие столбцы называются вычисляемыми. Это существенно расширяет возможности запросов. Простейшим примером вычисляемого поля в запросе может быть поле, которое объединяет имя и фамилию человека. На показан пример такого поля в запросе, созданном на базе таблиц "Сотрудники" (Employees) и "Заказы" (Orders).
Чтобы создать вычисляемое поле, нужно ввести выражение, которое вычисляет требуемое значение, в строку Поле (Field) свободного столбца бланка запроса. В данном примере это выражение представляет собой конкатенацию полей, содержащих имя и фамилию сотрудника, с пробелом между ними. В этом выражении мы используем ссылки на поля таблицы, которые в выражении заключаются в квадратные скобки. Перед выражением нужно написать имя поля: ФИО и отделить его двоеточием от выражения.
Совет
Если выражение длинное, его неудобно писать в строке Поле (Field). Нажмите комбинацию клавиш <Shift>+<F2>. Появится диалоговое окно Область ввода (Zoom), в котором вводить выражение удобнее. Можно также использовать Построитель выражений, вызвав его щелчком по кнопке Построить (Build) на панели инструментов. (Подробнее об использовании Построителя выражений и о правилах составления выражений в Access.)
Вы можете создать сколько угодно вычисляемых столбцов в запросе, используя при этом сколь угодно сложные выражения. С другими примерами создания таких столбцов вы познакомитесь в следующих главах книги.
Виды соединений
В зависимости от решаемых задач соединение между таблицами в запросах может быть нескольких видов.
Наиболее распространенным является внутреннее соединение (эквисоедшение). Если таблицы связаны отношением "один-ко-многим", соединения основываются на уникальном значении поля первичного ключа в одной таблице и значениях поля внешнего ключа в другой таблице. В результирующее множество запроса попадают все записи из главной таблицы (таблицы на стороне "один"), для которых имеются соответствующие записи в подчиненной таблице (таблице на стороне "многие"). Если в подчиненной таблице записи с заданной величиной отсутствуют, то соответствующие записи в главной таблице в результирующее множество не включаются. Подобного рода соединения между таблицами Access создает автоматически, если:

  • в таблицах имеются поля с одинаковыми именами и согласованными типами, причем одно из полей является ключевым;
  • соединение было явно задано в окне Схема данных (Relationships).

Замечание
"Согласованные типы" в большинстве случаев означают одинаковые типы. Исключением является поле типа Счетчик, которое может иметь размер Длинное целое или Код репликации и может связываться с числовыми полями соответствующего размера.
Результатом такого запроса являются все записи, значения связанных полей которых в обеих таблицах совпадают. Другими словами, эквисоединение связывает записи в таблицах отношением равенства значений связывающих полей.
Для создания запроса, объединяющего все записи из одной таблицы, и только те записи из второй, в которых связанные поля совпадают, используют внешнее соединение. В этом случае независимо от того, имеются ли соответствующие записи во второй таблице, все записи первой попадают в результирующее множество запроса.
Если необходимо связать данные любым отношением, кроме отношения равенства, используют соединение по отношению или тэта-соединение). Соединение по отношению не отображается в окне Схема данных (Relationships) и не выводится в окне Конструктора запросов.
Для обозначения внутренних соединений в Access используются зарезервированные слова ANSI SQL INNER JOIN, а для указания внешних соединений — слова LEFT JOIN или RIGHT JOIN. Выражение WHERE <поле1>=<поле2> соответствует внутреннему соединению, a WHERE поле1>поле2 — соединению по отношению (одному из таких соединений).

Для связывания данных в одной таблице применяют рекурсивное соединение. Оно создается путем добавления в запрос копии таблицы (в результате чего Access назначает псевдоним для копии) и связывания полей идентичных таблиц.