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

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

Следует соблюдать осторожность при изменении данных в запросе, применяющем опе­рацию объединения. Проблем не возникнет, если вы захотите изменить детали из таб­лицы-потомка. В примере на рис. 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 13-Jun-07 Cancelled
Toby Grayson 03-NOV-06 Returned
Toby Grayson 03-Nov-06 Shipped
    01-Jan-08 In Progress
    01 -Jan-08 In Progress

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

Подсказка

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

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

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

FirstName LastName ID DatePlaced StatusID
Stanley Lem 13-Jun-07 Cancelled
Toby Grayson 03-NOV-06 Returned
Toby Grayson 03-Nov-06 Shipped

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

FirstName LastName ID DatePlaced StatusID
Ben Samatara      
Goosey Mason      
Tabasoum Khan      

 
  На профессиональном уровне. Изменение данных при использовании запроса с объединением - student2.ru

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

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

Поиск несвязанных записей

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

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

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

 
  На профессиональном уровне. Изменение данных при использовании запроса с объединением - student2.ru

 
  На профессиональном уровне. Изменение данных при использовании запроса с объединением - student2.ru

Рис. 6.21. В этом запросе сочетаются внешнее объединение и условие отбора, которому соответствуют только несвязанные записи о клиентах. Обратите внимание на то, что флажок Вывод на экрансброшен. Это сделано потому, что поле ID применяется в условии отбора, но в его присутствии на листе данных с результатами нет никакой необходимости

Рис. 6.22. В этом примере список продуктов усилен данными о категории продукта и сведениями о поставщике. Таблица Products— потомок как таблицы ProductCategories,так и таблицы Suppliers(поставщики), таким образом, данный запрос без усилий использует обе эти таблицы

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

IS Null

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

Множественные объединения

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

 
  На профессиональном уровне. Изменение данных при использовании запроса с объединением - student2.ru

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

 
  На профессиональном уровне. Изменение данных при использовании запроса с объединением - student2.ru

Множественные объединения — всего лишь способ включения дополнительной связан­ной информации в ваш запрос. При наличии нескольких объединений каждое из них вы­полняется точно так же, как если бы оно было одним в запросе. Для использования множе­ственных объединений добавьте в запрос все нужные вам таблицы с помощью диалогового окна Добавление таблицы,убедитесь, что между таблицами появились линии объединения и затем выберите, какие хотите, поля. Программе 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).

Глава 7

Наши рекомендации