Создание внутреннего соединения по нескольким полям
Между двумя таблицами может быть задано несколько соединений. Например, допустим, что требуется вывести имена клиентов, у которых совпадают официальный адрес и адрес доставки. Адрес клиента хранится в поле "Адрес" таблицы "Клиенты", а адрес доставки — в поле "АдресПолучателя" таблицы "Заказы". Таким образом, необходимо сопоставить поля "КодКлиента" в обеих таблицах, а также поля "Адрес" и "АдресПолучателя". Для этого требуется использовать внутреннее соединение по нескольким полям.
Для вывода имен клиентов, официальный адрес и адрес доставки которых совпадают:
1. Создайте новый запрос
2. Добавьте в запрос таблицы "Клиенты" и "Заказы"
3. Выберите в списке полей таблицы "Клиенты" поле "Адрес" и перетащите его на поле "АдресПолучателя" таблицы "Заказы". Это приводит к созданию соединения полей Адрес и АдресПолучателя. Линия, обозначающая связь, имеет с двух сторон точки, которые указывают на то, что соединение выполнено между полями, связь которых в схеме данных не задана, их имена не совпадают, и они не являются первичными ключами.
4. Перетащите поля "Название" и "Адрес" таблицы "Клиенты", а затем поле "АдресПолучателя" таблицы "Заказы" на бланк запроса.
Чтобы запретить вывод одинаковых строк, необходимо изменить значение свойства "Уникальные значения" в бланке свойств запроса. Для отображения бланка свойств нажмите кнопку "Конструктор", а затем кнопку "Свойства" на панели инструментов, либо дважды щелкните по пустой области верхней части окна запроса. Если заголовком бланка является строка "Свойства списка полей" или "Свойства поля", щелкните по пустому месту, чтобы вывести свойства запроса. Кроме того, можно щелкнуть правой кнопкой мыши по свободной области верхней части окна запроса и выбрать в контекстном меню команду "Свойства".
По умолчанию свойство запроса "Уникальные записи" имеет значение Да, а свойство "Уникальные значения" — Нет. Поэтому в инструкцию SQL, связанную с запросом, добавляется ключевое слово ANSI SQL distinctrow. Измените значение свойства "Уникальные значения" на "Да". При этом вместо ключевого слова SQL DISTINCT в инструкции SQL будет участвовать ключевое слово Access distinctrow:
SELECT DISTINCTROW Клиенты.Название, Клиенты.Адрес, Заказы.АдресПолучателя
FROM Клиенты INNER JOIN Заказы ON (Клиенты.Адрес = Заказы.АдресПолучателя) AND (Клиенты.КодКлиента = Заказы.КодКлиента)
ORDER BY Клиенты.Название;
Для большинства заказов адрес клиента и адрес доставки совпадают, поэтому было бы лучше отыскивать заказы, для которых адреса различаются. Однако в Access нельзя создать такой запрос с помощью соединения по нескольким полям, т. к. в операции Access SQL inner join использовать оператор <> не допускается.