Внешнее соединение

Внешние соединения бывают левыми или правыми. Запрос, в котором участвуют таблицы с левым внешним соединением (LEFT JOIN или *= в SQL), выводит все записи таблицы "один", в независимости от того, имеются ли соответствующие им записи в таблице "многие". И наоборот, запрос, в котором участвуют таблицы с правым внешним соединением (RIGHT JOIN или =* в SQL), выводит все записи таблицы "многие", в независимости от того, имеются ли соответствующие им записи в таблице "один".
Рассмотрим в качестве примера, как с помощью левого внешнего соединения создать запрос в базе данных "Борей" (Northwind), который обнаруживает клиентов, не сделавших ни одного заказа:

  1. Создайте новый запрос и добавьте в него таблицы "Клиенты" (Customers) и "Заказы" (Orders). Поскольку эти таблицы связаны отношением "один-ко-многим", между ними сразу появляется соединяющая линия.
  2. Выделите и перетащите в бланк запроса поле "Название" (CompanyName) таблицы "Клиенты" и поле "КодЗаказа" (Orderld) таблицы "Заказы".
  3. Выполните запрос и посмотрите, сколько записей будет возвращать запрос: 830.
  4. Вернитесь в режим Конструктора. Щелкните правой кнопкой мыши на линии, соединяющей таблицы, и выберите из контекстного меню команду Параметры объединения (Join Properties). Появится диалоговое окно, представленное на. В данном окне показаны имена связанных полей в таблицах. При этом таблица на стороне "один" считается левой (независимо от того, как она расположена в окне Конструктора), а таблица на стороне "многие" — правой. Ниже расположены три переключателя:
    • "1" задает внутреннее соединение;
    • "2" — левое внешнее соединение;
    • "3" — правое внешнее соединение.

Замечание
Традиционно термин JOIN, который применяется к операции соединения таблиц, переводился как "объединение", хотя на самом деле операция объединения таблиц — это UNION, которая позволяет объединить все записи из одной таблицы и все записи из другой, а потом удалить дублирующиеся записи. Тем не менее, при локализации диалоговых окон Access по-прежнему, как мы видим, используется термин "объединение" по отношению к операции JOIN.

  1. Задайте левое внешнее соединение, выбрав значение "2". Нажмите кнопку ОК для закрытия диалогового окна. При этом на конце линии соединения появится стрелка в сторону таблицы "многие", что указывает на левое внешнее соединение.
  1. Установите сортировку по возрастанию для поля "КодЗаказа" (Orderld) во втором столбце бланка запроса.
  2. Нажмите на панели инструментов кнопку Запуск (Run) для вывода результирующего множества запроса с левым внешним -соединением. Количество записей стало равно 832, и первые две записи содержат пустое поле "КодЗаказа".
  1. Сохраните запрос под именем "Холодные клиенты". Он нам потребуется в дальнейшем. Запросы с правым внешним соединением используются гораздо реже, т. к., если при составлении схемы данных для связи между таблицами установлена ссылочная целостность, записей в таблице "многие" (подчиненной), не связанных с записями в таблице "один" (главной), просто не может не быть.

 

Рекурсивное соединение
В качестве примера рекурсивного соединения рассмотрим запрос к базе данных "Борей" (Northwind), в котором выводятся заказы клиентов, принятые и выполненные в один день.
Для создания такого запроса мы будем использовать таблицу "Заказы" (Orders):

  1. Создайте новый запрос и добавьте в него таблицу "Заказы".
  2. Добавьте в запрос копию таблицы, повторно нажав кнопку Добавить (Show Table). Access присваивает копии имя "Заказы_1". Закройте диалоговое окно Добавление таблицы (Show Table).
  3. Перетащите поле "ДатаРазмещения" (OrderedDate) исходной таблицы "Заказы" на поле "ДатаИсполнения" (ShippedDate) таблицы "Заказы_1". Между таблицами возникает соединение (рис. 4.29).
  4. Перетащите поля "КодЗаказа" (Orderld), "КодКлиента" (Customerld) и "ДатаРазмещения" (OrderedDate) таблицы "Заказы" в первые три столбца бланка запроса соответственно.
  1. При использовании рекурсивных соединений требуется задать вывод только уникальных значений. Дважды щелкните по свободной области верхней части окна запроса, а затем в диалоговом окне Свойства запроса (Query Properties) установите значение Да (Yes) для свойства Уникальные значения (Unique Values). Закройте окно Свойства запроса (Query Properties).
  2. Установите сортировку по убыванию для поля "ДатаИсполнения" (ShippedDate), чтобы последние обслуженные заказы были отображены первыми.
  3. Нажмите кнопку Запуск (Run) и вы должны получить таблицу заказов, в которых дата размещения и выполнения заказа является одинаковой.

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