Главная страница

Краткое содержание 29 Об этих стрелках 30 о сочетаниях клавиш 32 о щелчках кнопкой мыши 33 Примеры 33


Скачать 19.64 Mb.
НазваниеКраткое содержание 29 Об этих стрелках 30 о сочетаниях клавиш 32 о щелчках кнопкой мыши 33 Примеры 33
АнкорAccess_2007.doc
Дата16.03.2017
Размер19.64 Mb.
Формат файлаdoc
Имя файлаAccess_2007.doc
ТипКраткое содержание
#3862
страница21 из 65
1   ...   17   18   19   20   21   22   23   24   ...   65

Рис. 6.12. На последнем этапе вы выбираете имя для вашего запроса и немедленный вывод результатов или дальнейшее усовершенствование запроса в Конструкторе

Малоизвестная или недооцененная возможность.

Запросы на базе запросов
В примерах этой главы предполагается, что вы создаете запрос на базе таблицы из ва­шей БД. Но внимательные читатели могли заметить и другой возможный выбор — а именно возможность создания запроса, отбирающего результаты другого запроса. Если вы создаете запрос в окне Конструктора, нужно просто использовать вкладку Запросы в диалоговом окне Добавление таблицы (вместо вкладки Таблицы). Если же запрос создается с помощью мастера, все ваши запросы выводятся вместе с таблицами в рас­крывающемся списке Таблицы и запросы в первом окне мастера.

Чаще всего запрос строится на другом запросе, если вы хотите повторно использовать плоды вашего напряженного труда и упростить сложные запросы. Например, вы хотите создать запрос к БД Boutique Fudge, который находит клиентов, поместивших заказ в текущем месяце, и извлекает всю информацию об этих клиентах. На основе этого запро­са, возможно, вам захочется создать более специализированный итоговый запрос (см. разд. "Итоговые данные" главы 7), который объединяет клиентов в группы с учетом го­рода, в котором они живут, и подсчитывает, сколько у вас недавних покупателей в каж­дом регионе.

Можно создать один запрос, выполняющий оба этапа. Но разделив логику на две части, вы сможете легко повторно использовать первый запрос (недавние клиенты) для созда­ния множества связанных запросов.

Режим SQL

За кадром каждый запрос в действительности — текстовая команда, написанная на экзоти­ческом языке, именуемом SQL (Structured Query Language, язык структурированных запро­сов). Язык SQL— один из главных компонентов мира БД, он поддерживается всеми основ­ными программными продуктами для управления БД, хотя и с незначительными вариациями и индивидуальными отличительными особенностями.

Примечание

Гуру БД все еще спорят о том, как произносить название языка: "Эс-ку-эль" (что исторически корректно) или "Сиквэл" (именно это название применяется в программном обеспечении кор­порации Microsoft SQL Sever). В этой книге мы полагаем, что вы пользуетесь более продвину­тым вариантом "Сиквэл".

Когда вы создаете запрос в Конструкторе (или с помощью Мастера запроса), программа Access генерирует соответствующую команду SQL. Когда вы сохраняете запрос, Access про­сто сохраняет в вашей БД текст этой команды. Это все, что нужно программе для выполне­ния запроса в дальнейшем.

Чаще всего вы не будете тратить много времени на обдумывание SQL, прячущегося за вашими запросами. Но иногда нужно посмотреть на него повнимательнее. Далее перечисле­ны возможные причины.

  • Вы хотите выполнить действие, которое поддерживается языком SQL, но не доступно в Конструкторе запросов. Конечно, для редактирования команды нужно знать о языке больше, чем самая малость. Далее в этой главе вы узнаете, как с помощью Режима SQL создать запрос на объединение, содержащий в окне результатов данные двух похожих таблиц.

  • Вы хотите выучить язык SQL. Это неплохая идея, если вы хотите делать карьеру администратора БД, но это лишнее, если вы привязаны к программе Access.

  • Вы собираетесь перенести команду в другую программу управления БД. Вы можете находиться в состоянии переноса БД из Access в более мощную БД Oracle. Это работа, требующая усилий, и можно столкнуться с тем, что несмотря на возможность переноса данных в другое хранилище, перемещение других объектов, таких как запросы, невозможно. Вам придется познакомиться поближе с лежащим в основе запросов языком SQL, который можно использовать для реконструкции запроса в новой БД.

  • Вы просто любознательны без всякой задней мысли. Изучение команд SQL для ваших запросов снимает налет таинственности с принципов работы программы Access.

  • Вы — суперспециалист по написанию кода на языке SQL, и Конструктор запросов только тормозит вашу работу.

Для просмотра команды SQL для вашего запроса щелкните заголовок вкладки правой кнопкой мыши и выберите команду Режим SQL (SQL View). На рис. 6.13 показана команда, которую вы увидите.





Рис. 6.13. На экране команда SQL для запроса TopProducts, который находит товары, стоящие больше 50 долларов. Если вас испугал этот режим, в любой момент можно вернуться в другой, щелкнув правой кнопкой мыши заголовок вкладки и выбрав Конструктор или Режим таблицы

Анализ запроса

Несмотря на то, что язык SQL на первый взгляд кажется сложным, все запросы готовятся из одних и тех же ингредиентов. Рассмотрим запрос для поиска дорогостоящих заказов, кото­рые приведены далее (каждая строка пронумерована для облегчения ссылок), сводятся по сути к одним и тем же ингредиентам:

  1. SELECT Products.ID, Products.ProductName, Products.Price

  2. FROM Products

  3. WHERE (((Products.Price)>50))

  4. ORDER BY Products.Price;

Проанализируем первые две строки.

Строка 1 начинается со слова SELECT, означающего, что перед вами запрос, который выбирает записи (как и все запросы, с которыми вы имели дело в этой главе).

За словом SELECT следует разделенный запятыми список полей, которые вы хотите ви­деть. Каждое поле записано в длинном формате ИмяТаблицы. ИмяПоля, на случай если вы решите создать запрос, использующий несколько таблиц.

  • Строка 2 начинается со слова from, указывающего на таблицу (таблицы), которую вы исследуете. В данном случае нужные вам записи есть в таблице Products. В этих двух строках представлен законченный действующий запрос. Но часто в вашей

команде будут дополнительные строки, задающие параметры фильтрации и сортировки.

Строка 3 начинается со слова WHERE, указывающего на начало ваших условий отбора. В данном случае есть только одно условие — цена продукта должна быть больше 50 долларов. Если вы задали несколько условий отбора в разных полях, здесь будут представлены все они, объединенные с помощью оператора and.

Примечание

Программа Access несколько странным образом применяет скобки в условиях отбора. Предложение языка SQL WHERE ( ( (Products . Price) >50) ) можно упростить до следующего WHERE Products. Price>50. Access использует скобки, поскольку они облегчают анализ сложных запросов с множественными условиями отбора.

Строка 4 начинается со слов ORDER BY, которые определяют порядок сортировки.

В данном случае записи отсортированы по возрастанию значений в поле Price (цена).

Если задана сортировка по убыванию, вы увидите сокращение desc после имени поля.

Если сортируется несколько полей, вы увидите разделенный запятыми список полей.

Команда заканчивается завершающей точкой с запятой ( ; ). Программе Access эта деталь не нужна, но таковы соглашения в мире языка SQL.

Резюме приведенного урока состоит в том, что любой запрос, который вы создаете, фор­мируется из нескольких общих ингредиентов, представленных разделами SELECT, FROM, WHERE и ORDER BY.

Программа Access следит за синхронизацией разных режимов представления запроса. Если вы вносите изменение в текст SQL, а затем возвращаетесь в режим Конструктора, то

увидите только что откорректированную версию запроса (пока вы не допустили ошибку, при возникновении которой Access выводит на экран сообщение об ошибке).

Для проверки этого свойства можно изменить текст SQL так, чтобы выбирался дополни­тельный столбец и сортировка выполнялась по двум полям таким образом, чтобы продукты с одинаковой ценой выводились в алфавитном порядке (новые текстовые фрагменты выде­лены жирным шрифтом):

SELECT Products.ID, Products.ProductName, Products.Price, Products.Description

FROM Products

WHERE (((Products.Price)>100))

ORDER BY Products.Price, Products.ProductName;

Щелкните правой кнопкой мыши заголовок вкладки, затем выберите Конструктор для того, чтобы увидеть, как внесенные изменения отражены врежиме Конструктора.

Создание запроса на объединение
Конструктор не распознает некоторые редкие методы языка SQL. Их можно применить, только откорректировав команду SQL в Режиме SQL, и после внесения этих изменений вы больше не сможете просмотреть ваш запрос в Конструкторе (пока позже не удалите непод­держиваемое изменение).

Запрос на объединение (union query) — один из примеров запросов, временами очень по­лезных, но не поддерживаемых в Конструкторе запросов. Запрос на объединение объединя­ет результаты из нескольких таблиц и затем представляет их на общем листе данных.

По сути, запрос на объединение составляется из двух (или нескольких) отдельных за­просов на выборку. Тонкость заключается в том, что структура результатов всех запросов на выборку должна быть одинаковой. Таким образом, следует извлечь аналогичные столбцы из каждой таблицы в одном и том же порядке. Если вы выполнили все перечисленные требова­ния, остается только вставить слово union между двумя запросами.

Далее приведен запрос на объединение, который представляет список имен и фамилий, полученный из двух таблиц — Customers и Employees:

SELECT Customers.FirstName, Customers.LastName

FROM Customers

UNION

SELECT Employees . FirstName, Employees . LastName

FROM Employees

Этот запрос функционирует, несмотря на то, у таблиц Customers и Employees разная структура. Но гораздо важнее то, что структура результатов запросов к обеим таблицам, в данном случае поля FirstName и LastName, совпадает.

ПРИМЕЧАНИЕ

Создать запрос на объединение можно, даже если имена столбцов отличаются — если в таб­лице Employees содержатся столбцы с именами F_Name и L_Name, запрос все равно будет выполняться. Программа Access просто использует имена столбцов из первого запроса при выводе результатов на лист данных.

В данном примере, когда вы просматриваете результаты запроса, на экран выводится список имен и фамилий клиентов, за которым следует список имен и фамилий сотрудников, хотя вы не сможете с уверенностью определить, где заканчивается одна таблица и начинает­ся другая. Вы также не сможете редактировать данные — запросы на объединение предна­значены исключительно для просмотра сведений, а не для их изменения. Программа Access не позволит вам редактировать запросы на объединение в Конструкторе запросов. Если вы щелкнете правой кнопкой мыши заголовок вкладки и выберете Конструктор, вместо конст­руктора вы попадете в Режим SQL.

Программа помещает запросы па объединение в группу Несвязанные объекты (Unrelated Objects) в области переходов и применяет для их обозначения пиктограмму, от­личающуюся от пиктограммы обычного запроса (рис. 6.14).

Примечание

Если в результатах запроса на объединение выявляются совпадения, на экран выводится одна копия. Это поведение можно изменить, если заменить слово UNION словосочетанием UNION ALL. В предыдущем примере этот шаг вызовет повторное отображение в объединенных ре­зультатах человека, являющегося и клиентом, и сотрудником.





Рис. 6.14. Запросы на объединение появляются в области переходов с другой пиктограммой. Две пересекающиеся окружности обозначают несколько наборов результатов, отображаемых совместно

Запросы на объединение — это хороший способ соединения двух аналогичных таблиц, которые были разделены из соображений производительности, безопасности или способа распространения. (См. в разд. "Подготовка вашей базы данных" главы 18 различные причи­ны деления одного набора данных на несколько разных таблиц.) Эти запросы неудобны для обработки отношений "родитель — потомок". Для этой задачи вам нужны запросы на вы­борку с объединением таблиц (join queries), описанные в следующем разделе.

Для тех, кто понимает.

Подумайте дважды, прежде чем изменять структуру таблиц

Программа Access проявляет удивительную смекалку при отслеживании связей запросов с конкретными таблицами. Это особенность становится актуальной, когда вы распа­хиваете таблицу в Конструкторе для изменения ее структуры.

Предположим, что вы переименовываете таблицу Orders (заказы) в таблицу Sales (продажи) и поле DatePlaced (дата размещения) в поле OrderDate (дата заказа). В сле­дующий раз, когда вы запустите запрос FirstQuarterOrders_2007 (см. рис. 6.6), то с удивлением обнаружите, что он все еще действует. Программа Access знает о том, что запрос FirstQuarterOrders_2007 зависит от таблицы Orders. Когда вы изменяете имена в таблице, программа соответствующим образом корректирует запрос.

Access содержит отличное средство, способное проверить любой выбранный вами объ­ект БД и сообщить обо всех других объектах, которые от него зависят. Это средство можно применить для определения запросов, форм и отчетов, использующих таблицу Orders, прежде чем изменять ее. Для применения этого средства выполните следующие действия:

  1. Выберите Работа с базами данных → Показать или скрыть → Зависимости объектов (Database Tools Show/Hide Object Dependencies). В правой части окна программы Access появляется область Зависимости объектов. (Для того чтобы скрыть ее, выберите ту же последовательность еще раз.)

  2. В области переходов выберите объект БД, который вы хотите исследовать.

  3. В области Зависимости объектов выберите переключатель Объекты, зависящие от данного (Objects that depend on me), чтобы увидеть объекты, использующие данный, или переключатель Объекты, от которых зависит данный (Objects that I depend on), чтобы увидеть все объекты, которые использует данный объект.

  4. В верхней части области Зависимости объектов щелкните кнопкой мыши ссылку Обновить (Refresh). В области Зависимости объектов выводятся все соответствующие объекты, разделенные на категории в зависимости от их типа (рис. 6.15).

Программа Access не может отследить все зависимости, например, если вам нужно про­никнуть в Режим SQL для формирования запроса, который нельзя создать в режиме Конструктора. Если создается запрос на объединение (как в предыдущем примере), у Access не хватает сообразительности для того, чтобы выяснить, от каких таблиц зависит ваш запрос. Если вы изменили структуру этих таблиц, то при следующем выполнении запроса получите сообщение об ошибке, говорящее о том, что программа не может най­ти нужное поле или таблицу. (Для исправления ошибки необходимо снова открыть за­прос в Режиме SQL и заменить имена полей или таблиц их новыми значениями.)





Рис. 6.15. На рисунке в области Зависимости объектов анализируется таблица Products. Отображены три таблицы, связанные с Products, и четыре запроса, использующие таблицу Products. В любой объект можно углубиться, щелкнув кнопкой мыши квадратик со знаком "плюс" (+), расположенный рядом с именем объекта. (Щелкните кнопкой мыши + рядом с именем TopProducts, чтобы выяснить, используют ли другие объекты БД данный запрос.) В конце списка находится раздел Пропущенные объекты. В нем отображен запрос на объединение CustomersAndEmployees, и это свидетельствует о том, что у программы Access нет данных о его зависимостях

Запросы и связанные таблицы
В главе 5 вы узнали, как делить данные на базовые фрагменты и сохранять их в отдельных хорошо организованных таблицах. У такого проекта есть лишь одна проблема — гораздо труднее представить общую картину, если связанные данные хранятся в разных местах. К счастью, Access обладает чудесным средством — вы можете снова соединить таблицы при выводе на экран с помощью операции объединения (join).

Объединение — операция запроса, извлекающая столбцы из двух таблиц и соединяющая их на листе результатов. Объединение применяется для усиления подчиненных таблиц дан­ными из таблицы-родителя.

Далее приведено несколько примеров.

В БД кукол-болванчиков можно отобразить список кукол (извлеченный из таблицы Dolls) совместно с данными об изготовителе каждой куклы-болванчика (из таблицы-родителя Manufacturers).

В БД школы Cacophone music можно получить список учебных классов, снабженный информацией о преподавателях.

Из БД Boutique Fudge можно извлечь список заказов, дополнив его сведениями о клиен­те, сделавшем заказ.




Примечание

Вы уже научились создавать таблицы подстановок для отображений части информации из свя­занной таблицы. Подстановка может вывести название категории изделия из поля ProductID вместо кода изделия. Но запрос с использованием операции объединения гораздо мощнее. Он может выбрать массу сведений из связанной таблицы — гораздо больше, чем может вместить одно поле.

На рис. 6.16 показано объединение таблиц.
Рис. 6.16. Сама по себе таблица Classes содержит данные о каждом классе, но она предоставляет только идентификационный номер назначенного преподавателя. Соедините эту таблицу с таблицей Teachers, и вы получите любую интересующую вас информацию из связанной записи о преподавателе — включая его имя и фамилию

Объединение таблиц в запросе
Access делает удивительно легким объединение двух таблиц. Первый шаг — добавление обеих таблиц в ваш запрос, с помощью диалогового окна Добавление таблицы (Show Table).

Если в Конструкторе создается новый запрос, это окно появляется немедленно. Если вы работаете над уже созданным запросом, убедитесь, что вы в режиме Конструктора, щелкни­те правой кнопкой мыши окно и выберите в меню строку Добавление таблицы.

Е
сли связь между таблицами уже определена (с помощью схемы данных, как описано в разд. "Определение отношения" главы 5, или созданием подстановки, как описано в разд. "Поиск в связанных таблицах" главы 5), программа Access использует эту связь для автома­тического выполнения операции объединения. Вы увидите на схеме линию, соединяющую соответствующие поля, как показано на рис. 6.17.
Рис. 6.17. Access автоматически соединяет поле CustomerlD в таблице Orders с полем ID в таблице Customers, основываясь на связи, определенной в БД

Если связь между двумя связанными таблицами еще не определена, возможно, это следует сделать до того, как создавать запрос (см. подробные инструкции в главе 5). Но если вы по каким-то непонятным причинам решили не создавать связь (может быть, про­ект БД был введен в эксплуатацию другим, менее сообразительным специалистом Access), вы можете задать объединение вручную в окне запроса. Для этого просто перета­щите мышью связанное поле одной таблицы на совпадающее поле в другой. Можно также удалить объединение, щелкнув правой кнопкой мыши линию объединения и выбрав команду Удалить (Delete).

Примечание

Если вы добавляете две несвязанные таблицы, программа Access пытается угадать связь, чтобы помочь вам. Если она находит поле с одинаковыми типами данных и именем в обеих табли­цах, она добавляет связь для этих полей. Подобное действие зачастую совсем не то, что вам нужно — например, у многих таблиц есть общее поле Код (ID). Однако если вы строго соблю­даете правила проектирования БД, приведенные в разд. "Шесть правил проектирования БД" главы 2, у связанных полей имена в разных таблицах слегка отличаются, например ID и CustomerID. Если программа все же предлагает несуществующую связь, просто удалите ее, преж­де чем выполнять нужное объединение.

На профессиональном уровне.

Сравнение: отношения и объединения
Важно понимать различия между отношением или связью и запросом с операцией объединения.

  • Отношение — постоянная связь между двумя таблицами, хранящаяся в БД. Когда создается отношение в БД, есть возможность включить режим обеспечения целостности данных: набора правил, препятствующих проникновению противоречивых данных в связанные таблицы (см. разд. "Целостность на уровне ссылок " главы 5).

  • Объединение — операция запроса, позволяющая соединять связанные данные из двух таблиц в одном результирующем наборе. Объединение не влияет на то, как вы вводите и редактируете объединенные данные в базовых таблицах.

Если отношение установлено, Access считает, что вы хотите использовать операцию объединения для связи этих таблиц в запросе — единственное действие, имеющее смысл.

После того как вы поместили две таблицы в окно Конструктора запросов и определили операцию объединения, можно выбирать нужные вам поля из обеих таблиц. Можно также добавить условия отбора записей и задать порядок их сортировки, как в запросе любого дру­гого типа. На рис. 6.18 показан пример запроса, использующего операцию объединения, а на рис. 6.19 — результат выполнения этого запроса.
Примечание

Если у вас две таблицы, легко забыть, что вы выводите на экран. Если объединяются таблицы Orders и Customers, а затем из каждой выбираются поля, что вы получите в результате: спи­сок заказов или список клиентов? Ответ прост — вы получаете список заказов, дополненный информацией о клиентах. Запросы со связанными таблицами всегда обрабатывают таблицу-потомок и берут дополнительную информацию из таблицы-родителя.

Примечание

При выполнении объединения вы видите повторяющуюся информацию. Если объединяются таблицы Customers и Orders, вы видите имя и фамилию самого активного клиента рядом с несколькими заказами. Но при этом правило запрета дублирующихся данных не нарушается. Несмотря на то, что сведения о клиенте появляются в нескольких местах на листе данных с ре­зультатами запроса, в таблице Customers они сохраняются всего один раз.

Когда вы связываете родительскую и дочернюю таблицы с помощью запроса с операцией объединения, то выполняете запрос, получающий все записи из дочерней таблицы, и затем добавляете дополнительную информацию из родительской таблицы. Страница в конце
Р
ис.6.18.
Этот запрос отображает данные из таблиц Orders и Customers. Неважно, из какой таблицы первое поле – в любом случае вы создаете список заказов с дополнительными сведениями о клиентах. Обратите внимание на строку Имя таблицы (Table) (под строкой Поле), указывающую на таблицу, из которой в запрос попадает каждое поле
Рис.6.19. Вы легко можете при беглом просмотре увидеть, кто что заказал. Столбец ID содержит идентификационный номер заказа (хотя вы могли бы отобразить идентификационные номера как таблицы Customers, так и таблицы Orders)
Например, можно применить запрос с объединением для получения списка заказов (из дочерней таблицы) и дополнения каждой записи информацией о клиенте, сделавшем заказ. Независимо от способа объединения вы никогда не получите список клиентов с присоеди­ненной информацией о заказе — в этом нет смысла, поскольку каждый клиент может сде­лать много заказов.

Операции объединения — одно из самых мощных средств в наборе инструментов любого разработчика запросов. Они позволяют отображать одну таблицу со всей нужной вам ин­формацией.

Примечание

Когда используется несколько таблиц, всегда есть риск наличия одноименных полей в обеих таблицах. Такая возможность не страшна, если вы не собираетесь отображать эти поля в ва­шем запросе, но если это не так, возможны проблемы. Единственный способ различить по­ля — переименовать одно из них на листе данных с результатами запроса. Из примечания "Малоизвестная или недооцененная возможность, Переименование поля в запросе" в разд. "Определение вычисляемого поля" главы 7 вы узнаете, как это сделать с помощью вычисляе­мого поля.

На профессиональном уровне.

Изменение данных при использовании запроса с объединением

Следует соблюдать осторожность при изменении данных в запросе, применяющем опе­рацию объединения. Проблем не возникнет, если вы захотите изменить детали из таб­лицы-потомка. В примере на рис. 6.19 достаточно легко изменить поля DatePlaced или StatusID в записи о заказе.

Но что произойдет, если вы измените одно из значений таблицы-родителя, например, имя или фамилию клиента? Очевидно, что сведения об одном и том же клиенте могут выводиться в запросе несколько раз. (Например, в запросе на рис. 6.19 отображены два заказа клиента с именем Toby.) Если изменить имя в одном месте, программа Access ав­томатически изменит информацию в таблице Customers и затем обновит весь запрос. Таким образом, если вы замените "Toby" на "Топу" на рис. 6.19, Access обновит вторую и третью строки на листе данных.

Проблема возникает, когда вы хотите изменить связь между записью о заказе и записью клиента. Например, вы хотите отредактировать заказ, сделанный Toby, так, чтобы в БД было записано, что этот заказ сделан клиентом Lisa. Но этого сделать невозможно с по­мощью редактирования в запросе полей FirstName и LastName. (Если вы отредакти­руете имя и фамилию, то просто измените запись о Toby в таблице Customers.) Вместо этого вам нужно откорректировать поле CustomerID в таблице Orders так, чтобы оно указывало на нужного клиента. Но в запрос, показанный на рис. 6.19, иоле CustomerID не включено, поэтому изменить связь невозможно.

Внешние объединения
В запросах, которые вы видели в предыдущем примере, используются операции, которые специалисты БД называют внутренним объединением (inner join). Внутренние объединения выводят только связанные записи — другими словами, записи, встречающиеся в обеих таб­лицах. Если выполнить запрос к таблицам Customers и Orders, вы не увидите клиентов, не сделавших

ни одного заказа. Вы также не увидите заказов, не связанных с конкретным кли­ентом (пропущено значение в поле CustomerID) или не связанных с корректной записью (они могут содержать значение в поле CustomerID, не соответствующее ни одной записи в таблице Customers).

Внешние объединения (outer join) более емкие — они включают все результаты внутрен­него объединения плюс оставшиеся в одной из таблиц (по вашему выбору) несвязанные записи. Очевидно, что эти несвязанные записи выводятся в окне результатов запроса с не­которыми пропущенными значениями, соответствующими пропущенным данным, которые должна была бы предоставить таблица.

Предположим, что вы выполняете внешнее объединение таблиц Orders и Customers, а за­тем настраиваете его так, чтобы выводились все записи о заказах. Все заказы, не связанные с записью о клиенте, появятся в нижней части списка и будут иметь незаполненные значения во всех полях со сведениями о клиенте (таких как FirstName и LastName) — табл. 6.1.

Таблица 6.1. Результат внешнего объединения таблиц Orders и Customers: все записи о заказах

FirstName

LastName

ID

DatePlaced

StatusID

Stanley

Lem

7

13-Jun-07

Cancelled

Toby

Grayson

4

03-NOV-06

Returned

Toby

Grayson

6

03-Nov-06

Shipped







18

01-Jan-08

In Progress







19

01 -Jan-08

In Progress

В данном конкретном примере нет смысла в существовании заказов, не связанных с кон­кретным клиентом. (На самом деле, скорее всего, это некорректно введенный заказ.) Если вы подозреваете наличие проблемы, внешнее объединение поможет устранить ее.

Подсказка

Вы можете помешать появлению записей-сирот с данными о заказе, сделав поле CustomerID обязательным (см. разд. "Запрет незаполненных полей" главы 4) и обеспечив ссылочную цело­стность (см. разд. "Целостность на уровне ссылок" главы 5).

Вы также можете выполнить внешнее объединение таблиц Orders и Customers, которое отображает все записи о клиентах. В этом случае в конце результатов запроса вы увидите все несвязанные записи о клиентах с соответствующими пустыми полями, которые должны были бы содержать сведения о заказах (табл. 6.2).

Таблица 6.2. Результат внешнего объединения таблиц Orders и Customers: все записи о клиентах

FirstName

LastName

ID

DatePlaced

StatusID

Stanley

Lem

7

13-Jun-07

Cancelled

Toby

Grayson

4

03-NOV-06

Returned

Toby

Grayson

6

03-Nov-06

Shipped

Таблица 6.2 (окончание)

FirstName

LastName

ID

DatePlaced

StatusID

Ben

Samatara










Goosey

Mason










Tabasoum

Khan










В
данном случае запрос с внешним объединением выбрал трех отстающих. Хотите знать, как добавить внешнее объединение в ваш запрос? Начните с внутреннего объединения (которое программа Access добавляет автоматически, см. разд. "Объединение таблиц в запро­се" ранее в этой главе), а затем преобразуйте его во внешнее. Для этого просто щелкните правой кнопкой мыши линию объединения, связывающую две таблицы в окне Конструкто­ра, и выберите команду Параметры объединения (Join Properties) (или дважды щелкните кнопкой мыши эту линию). На экране появится одноименное диалоговое окно (рис. 6.20), позволяющее изменить тип используемого вами объединения.
Рис. 6.20. Выбор первого переключателя Объединение только тех записей, в которых связанные поля обеих таблиц совпадают приводит к выполнению операции стандартного внутреннего объединения. Два оставшихся переключателя позволяют создать внешнее объединение, включающее все несвязанные строки одной из двух таблиц

Поиск несвязанных записей
Внутренние объединения — гораздо более распространенный тип объединений. Но внешние объединения позволяют создать, по крайней мере, один важный тип запроса: запрос, отсле­живающий несвязанные записи (unmatched records).

Вы уже видели, как внешнее объединение дает возможность увидеть список всех ваших заказов плюс клиентов, не сделавших ни одного заказа. Эта комбинация не так уж полезна. Но отдел по маркетингу очень заинтересован во второй части этого сочетания — списке лю­дей, до сих пор ничего не купивших. Эта информация поможет сотрудникам отдела провес­ти кампанию поощрения клиентов, сделавших первую покупку.

Для выполнения такого запроса начните с запроса с внешним объединением, включаю­щего все записи о клиентах. Затем добавьте один ингредиент: условие отбора, выбирающее записи без кода (ID) заказа. Технически это неопределенные (null) или пустые значения.





Р
ис.
6.21. В этом запросе сочетаются внешнее объединение и условие отбора, которому соответствуют только несвязанные записи о клиентах. Обратите внимание на то, что флажок Вывод на экран сброшен. Это сделано потому, что поле ID применяется в условии отбора, но в его присутствии на листе данных с результатами нет никакой необходимости
Рис. 6.22. В этом примере список продуктов усилен данными о категории продукта и сведениями о поставщике. Таблица Products — потомок как таблицы ProductCategories, так и таблицы Suppliers (поставщики), таким образом, данный запрос без усилий использует обе эти таблицы

Далее приведено нужное условие фильтрации, которое следует поместить в строке Ус­ловие отбора поля ID таблицы Orders:

IS Null

Теперь, когда программа Access выполнит запрос, она включит только записи клиентов, не связанные с записями в таблице заказов. На рис. 6.21 показан этот запрос в Конструкторе.

Множественные объединения
Как только вы освоились с внутренними и внешними объединениями, Access подбрасывает вам новую функциональную возможность. Многие запросы не ограничиваются одним объ­единением. Они используют три, четыре и больше объединений для соединения данных из многих связанных таблиц. Несмотря на то, что поначалу это кажется устрашающим, ничего сложного в этом нет.
Р
ис. 6.23.
Если вы хотите выяснить, кто заказал каждый продукт, вам понадобится связанная таблица Orders, а затем придется перейти к связанной таблице Customers Даже если вы не хотите отображать какие-либо данные из таблицы Orders, вам все равно не обойтись без этого двухшагового процесса. На верхнем рисунке показан запрос, реализующий этот процесс, а на нижнем — результат, который вы получите после выполнения запроса

М
ножественные объединения — всего лишь способ включения дополнительной связан­ной информации в ваш запрос. При наличии нескольких объединений каждое из них вы­полняется точно так же, как если бы оно было одним в запросе. Для использования множе­ственных объединений добавьте в запрос все нужные вам таблицы с помощью диалогового окна Добавление таблицы, убедитесь, что между таблицами появились линии объединения и затем выберите, какие хотите, поля. Программе Access почти всегда хватает интеллекта, чтобы понять, что вы собираетесь делать.

На рис. 6.22 показан пример, в котором у таблицы-потомка два родителя, способных вне­сти некоторую дополнительную информацию.
Рис. 6.24. Вы видите, как определить список курсов, содержащий рядом с каждым курсом имя и фамилию преподавателя, ведущего курс. На верхнем рисунке показана нужная вам структура запроса, а на нижнем — результат

Иногда нужная вам информация находится в таблице, которая непосредственно не свя­зана с основной таблицей запроса. Обратите внимание на таблицу OrderDetails, которую компания Boutique Fudge использует для перечисления всех товаров в заказе клиента. Сама по себе таблица OrderDetaits связана не с клиентом, заказавшим товары, а со связанной

записью о заказе (см. разд. "Заказ товаров" главы 5, в котором обсуждается этот проект БД). Если вы хотите получить сведения о том, кто заказал каждый товар, следует добавить в за­прос таблицы OrderDetails, Orders и Customers, как показано на рис. 6.23.

Множественные объединения незаменимы, если у вас есть отношение "многие-ко-многим" со связующей таблицей (см. разд. "Отношение "многие-ко-многим"" главы 5), как между преподавателями и курсами. Как вы помните из главы 5, музыкальная школа Cacophone Studios использует промежуточную таблицу для отслеживания назначений пре­подавателей для ведения конкретных курсов. Если вы хотите получить список учебных кур­сов, дополненный именем и фамилией преподавателя, ведущего курс, придется создать за­прос с тремя таблицами: Classes, Teachers и Teachers_Classes (рис. 6.24).

1   ...   17   18   19   20   21   22   23   24   ...   65


написать администратору сайта