Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_N4_сложные_запросы.doc
Скачиваний:
6
Добавлен:
28.07.2019
Размер:
286.72 Кб
Скачать

Создание рекурсивного соединения

Рекурсивные соединения связывают поля одной таблицы. При этом сначала требуется добавить в запрос копию таблицы, а затем задать соединение. В качестве примера рассмотрим запрос, в котором выводятся сотрудники, которые подчиняются другим. Для создания рекурсивного соединения в таблице "Сотрудники":

  1. Создайте новый запрос и добавьте в него таблицу "Сотрудники".

  2. Добавьте в запрос копию таблицы " Сотрудники", повторно нажав кнопку "Добавить".

  3. Перетащите поля «КодСотрудника» и «Фамилия» таблицы «Сотрудники» и поле «Подчиняется» таблицы «Сотрудники_1» в бланк запроса.

  1. При использовании рекурсивных соединений требуется задать вывод только уникальных значений. Присвойте значение «Да» свойству «Уникальные значения».

Создание соединения по отношению

Большинство соединений основаны на полях с одинаковыми значениями. Однако в некоторых случаях требуется создать связь неравных полей.

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

Поиск клиентов, которые имеют разный официальный адрес и адрес доставки, является примером, в котором требуется использовать соединение по отношению. Для создания связи, эквивалентной данному соединению:

  1. Создайте новый запрос и добавьте в него таблицы "Клиенты" и "Заказы".

  2. Перетащите поля "Название" и "Адрес" таблицы "Клиенты", а также поле "АдресПолучателя" таблицы "Заказы" соответственно в первые три столбца бланка запроса.

  3. Введите в строке "Условие отбора" столбца поля "АдресПолучателя" выражение <>[Клиенты].[Адрес]. В инструкцию SELECT добавляется предложение WHERE Заказы.АдресПолучателя <>[Клиенты].[Адрес]:

SELECT DISTINCT Клиенты.Название, Клиенты.Адрес, Заказы.АдресПолучателя

FROM Клиенты INNER JOIN Заказы ON Клиенты.КодКлиента = Заказы.КодКлиента

WHERE (((Заказы.АдресПолучателя)<>[Клиенты].[Адрес]));

Если ввести в столбце поля "Адрес" выражение <> Заказы. АдресПолучателя, то будет получен идентичный результат. В инструкцию SELECT добавляется предложение WHERE Клиенты.Адрес <>[Заказы].[АдресПолучателя].

  1. Нажмите на панели инструментов кнопку "Свойства", либо дважды щелкните по свободной области верхней части окна запроса, а затем присвойте в бланке свойств запроса значение Да свойству "Уникальные значения".Выполните запрос. Результирующее множество содержит только те записи, в которых различаются адрес клиента и адрес доставки.

Использование запросов для обновления таблиц

Большинство запросов, свойство "Уникальные записи" которых имеет значение Да, могут использоваться для обновления данных, потому что в предложении SQL, связанном с ними, участвует ключевое слово DISTINCTROW. Эти запросы создают объекты Recordset типа Dynaset, допускающими обновление. Результирующее множество можно обновить, только если в его конце имеется пустая запись (со звездочкой на кнопке выделения). Запросы, свойство "Уникальные значения" которых имеет значение Да, создают объекты Recordset типа Snapshot путем замены ключевого слова ANSI SQL DISTINCT. Такие объекты не допускают ни обновления, ни редактирования имеющихся в них записей, ни добавления новых. Рассмотрим, как обновить запись таблицы, включенной в динамический набор запроса, а также как форматировать данные, используя бланк свойств поля запроса.

Замечание: Нельзя присваивать обоим свойствам — "Уникальные значения" и "Уникальные записи" значение "Да" одновременно. Присвоение значения "Да" свойству "Уникальные значения" добавляет модификатор DISTINCT в предложение SQL, запрещая обновление объектов Recordset. В то же время, присвоение значения "Да" свойству "Уникальные записи" добавляет в предложение SQL модификатор DISTINCTROW, который разрешает обновление объектов Recordset.