Внешние объединения

 

В запросах, которые вы видели в предыдущем примере, используются операции, которые специалисты БД называют внутренним объединением (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. Выбор первого переключателя Объединение только тех записей, в которых связанные поля обеих таблиц совпадают приводит к выполнению операции стандартного внутреннего объединения. Два оставшихся переключателя позволяют создать внешнее объединение, включающее все несвязанные строки одной из двух таблиц

 

 

 

 

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100