Access для Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Еще…Меньше
Видео:
В этом видео
Сообщение «Неоднозначное внешнее присоединение» появляется, когда Access определяет, что запрос может давать разные результаты в зависимости от того, какое присоединение было сделано в первую очередь. Чтобы выполнить запрос, необходимо внести некоторые изменения. Лучше всего разделить запрос на части. Это значит, что по крайней мере одно из запросов можно создать с помощью небольших «детей», которые затем будут соединяться с другими таблицами или запросами в родительском запросе. Затем Access сначала выполняет их в запросе (или запросе) ребенка, а затем выполняет их в родительском запросе в последнюю очередь, устраняя неоднозначность.
В зависимости от количества таблиц в запросе может потребоваться создать несколько детских запросов, чтобы избежать неоднозначных внешних запросов. В этом видео показан простой пример из трех таблиц, в котором две равносвязаные таблицы разделены на запросы ребенка, а внешнее соединиться с третьей таблицей — в родительском запросе. Ниже ряду основных действий предполагается, что вы уже знакомы с созданием простого запроса на выборки:
-
Создайте запрос для ребенка, содержащий таблицы, к которые нужно сначала присоединить (в видеоролике это таблицы «Компании» и «Люди»).
-
В запросе дважды щелкните необходимые выходные поля, чтобы они появились в сетке запроса.
Важно: Не забудьте включить поле для join из исходного запроса. В примере с видео компании присоединились к регионам с помощью поля RegionID, поэтому мы включаем RegionID в сетку запроса для ребенка запроса.
-
Сохраните и закройте запрос ребенка, а затем откройте исходный запрос в конструкторе. Это будет родительский запрос.
-
Удалите таблицы, добавленные в запрос ребенка, а затем добавьте запрос «ребенок»(«Конструктор > Добавление таблиц»(«Добавление таблицы» в Access 2013 )> «Запросы»или просто перетащите в родительский запрос запрос из области навигации).
-
В родительском запросе создайте такое же, как и раньше, только на этот раз для запроса ребенка.
-
Добавьте выходные поля запроса в сетку запроса.
-
Сохраните и запустите родительский запрос.
Правило при неоднозначных внешних соединителах
Неоднозначные внешние соединителения возникают, если в запросе есть несколько таких соединителиков, одно из которых — внешнее, которое указывает на equi-join, или два внешних соединитела друг на друга. Например, эти две конфигурации неоднозначны, и их нужно разделить на отдельные запросы:
Таблица1 —> Таблица2 — Таблица3
Таблица1 —> Таблица2 <— Таблица3
Для внешних соединителений, которые указывают в том же направлении или далеко от других внешних или equi-joins, это нормально:
Таблица1 —> Таблица2 —> Таблица3
Таблица1 <— Таблица2 —> Таблица3
Таблица1 <— Таблица2 — Таблица3
Дополнительные сведения о создании запросов см. в обзоре запросов и создании простого запроса на выборки.
Нужна дополнительная помощь?
Нужны дополнительные параметры?
Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.
В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.
If you create a query that contains a LEFT JOIN and an INNER JOIN, Access may not be able to determine which join operation to perform first. Because the results are different depending on whether the left join or the inner join is performed first, Access displays an error message:
To correct this error, you must modify the query so that it is clear which join to perform first.
Consequently solution can be achieved by splitting this into two queries and then joining them in and additional query.
Query 1:
SELECT route.productfam, facility.location, Asmlines.line, [18Months].[Month 1], [18Months].[Month 2], [18Months].[Month 3], [18Months].[Month 4], [18Months].[Month 5], [18Months].[Month 6], [18Months].[Month 7], [18Months].[Month 8], [18Months].[Month 9], [18Months].[Month 10], [18Months].[Month 11], [18Months].[Month 12], [18Months].[Month 13], [18Months].[Month 14], [18Months].[Month 15], [18Months].[Month 16], [18Months].[Month 17], [18Months].[Month 18], route.cycletime, route.numperprod, facilitylines.operationalhr
FROM (facility INNER JOIN (ProductFamily INNER JOIN 18Months ON ProductFamily.productfamily = [18Months].[Item Type]) ON facility.location = [18Months].Location) INNER JOIN ((Asmlines INNER JOIN facilitylines ON Asmlines.line = facilitylines.line) INNER JOIN route ON Asmlines.line = route.line) ON (ProductFamily.productfamily = route.productfam) AND (facility.location = facilitylines.facility)
GROUP BY route.productfam, facility.location, Asmlines.line, [18Months].[Month 1], [18Months].[Month 2], [18Months].[Month 3], [18Months].[Month 4], [18Months].[Month 5], [18Months].[Month 6], [18Months].[Month 7], [18Months].[Month 8], [18Months].[Month 9], [18Months].[Month 10], [18Months].[Month 11], [18Months].[Month 12], [18Months].[Month 13], [18Months].[Month 14], [18Months].[Month 15], [18Months].[Month 16], [18Months].[Month 17], [18Months].[Month 18], route.cycletime, route.numperprod, facilitylines.operationalhr, route.productfam
ORDER BY facility.location;
Query 2:
SELECT route.productfam, facility.location, Asmlines.line, tableconsolidate2.SumOfyr, tableconsolidate2.SumOfyr0, tableconsolidate2.SumOfyr1, tableconsolidate2.SumOfyr2, tableconsolidate2.SumOfyr3, tableconsolidate2.SumOfyr4, tableconsolidate2.SumOfyr5, route.cycletime, route.numperprod, facilitylines.operationalhr
FROM (ProductFamily INNER JOIN (facility INNER JOIN tableconsolidate2 ON facility.location = tableconsolidate2.[Build Plant]) ON ProductFamily.productfamily = tableconsolidate2.[Prod Series]) INNER JOIN ((Asmlines INNER JOIN facilitylines ON Asmlines.line = facilitylines.line) INNER JOIN route ON Asmlines.line = route.line) ON (ProductFamily.productfamily = route.productfam) AND (facility.location = facilitylines.facility)
GROUP BY route.productfam, facility.location, Asmlines.line, tableconsolidate2.SumOfyr, tableconsolidate2.SumOfyr0, tableconsolidate2.SumOfyr1, tableconsolidate2.SumOfyr2, tableconsolidate2.SumOfyr3, tableconsolidate2.SumOfyr4, tableconsolidate2.SumOfyr5, route.cycletime, route.numperprod, facilitylines.operationalhr, route.productfam
ORDER BY facility.location;
Query 3:
Query 1 LEFT JOIN Query 2
Мастер
(1336),
закрыт
10 лет назад
mad demiurge
Профи
(833)
10 лет назад
1. Вы создали связь между таблицами?
2. Не могли бы Вы показать текст запроса и объяснить, что конкретно при его выполнении Вы хотели бы видеть?
МилаМастер (1336)
10 лет назад
1. да.создала связи.
2. текст запроса большеватый… но вот такой
SELECT [По месяцам].Месяц, [Оклад по должностям].Должность, [Оклад по должностям].Оклад
FROM [Оклад по должностям] RIGHT JOIN (Сотрудники RIGHT JOIN ([По месяцам] LEFT JOIN [Начисления (По месяцам)] ON [По месяцам].Код = [Начисления (По месяцам)].Месяц) ON Сотрудники.[Код сотрудника] = [Начисления (По месяцам)].Сотрудник) ON ([Оклад по должностям].Код = [Начисления (По месяцам)].Должность) AND ([Оклад по должностям].Код = Сотрудники.Должность) AND ([Оклад по должностям].Код = [По месяцам].Должность)
WHERE ((([Сотрудники]![ФИО])=[Введите ФИО сотрудника]));
а результат нужен следующий.
ввожу сотрудника петров, выводится:
янв администратор 10 000р
фев администратор 10 000р
…
дек администратор 10 000р
ввожу сотрудника путин, выводится:
янв официант 5 000р
фев официант 5 000р
…
дек адмиинстратор 10 000р
GreyW 14 / 14 / 7 Регистрация: 21.06.2013 Сообщений: 163 Записей в блоге: 1 |
||||||||||
1 |
||||||||||
02.07.2015, 16:36. Показов 2601. Ответов 5 Метки нет (Все метки)
Такой запрос работает
А такой не работает
Выходит сообщение: Невозможно выполнить инструкцию SQL, так как запрос содержит неоднозначные внешние соединения. Для явного указания соединения, выполняемого первым, создайте отдельный запрос и включите его в инструкцию SQL. На два запроса я могу разбить, но мне нужно одним, т.к. обращение к базе будет из Delphi. Подскажите, как это сделать? Вложения
0 |
texnik-san шапоклякистка 8-го дня 3676 / 2236 / 391 Регистрация: 26.06.2015 Сообщений: 4,647 Записей в блоге: 1 |
||||
02.07.2015, 16:41 |
2 |
|||
Просто заменить INNER JOIN на еще один LEFT JOIN.
1 |
14 / 14 / 7 Регистрация: 21.06.2013 Сообщений: 163 Записей в блоге: 1 |
|
02.07.2015, 16:56 [ТС] |
3 |
В таблице tblСЭТ 12 записей, и запрос должен выдать 12. Даже если нет подчиненных записей в таблице tblИзмерения. А он выдает всё равно 11 записей и в моем и в Вашем варианте.
0 |
texnik-san шапоклякистка 8-го дня 3676 / 2236 / 391 Регистрация: 26.06.2015 Сообщений: 4,647 Записей в блоге: 1 |
||||
02.07.2015, 17:16 |
4 |
|||
Сообщение было отмечено GreyW как решение РешениеА двенадцатый отсекается поставленным вами условием WHERE. Если хотите, чтобы в запросе с внешними связями отображались все записи — к условиям на все поля тех таблиц, где могут отстуствовать записи, добавляйте всегда вариант Or Is Null.
1 |
17310 / 7137 / 1612 Регистрация: 21.06.2012 Сообщений: 13,456 |
|
02.07.2015, 17:17 |
5 |
А условие fldАтрибуты6=»17.06.15″ учесть не хотите?
1 |
GreyW 14 / 14 / 7 Регистрация: 21.06.2013 Сообщений: 163 Записей в блоге: 1 |
||||||||
06.07.2015, 13:25 [ТС] |
6 |
|||||||
Что-то здесь не то?
Но если делаю одним запросом, то левая половина (tblСЭТ) дублируется несколько раз вместе со всеми нулевыми записями правой половины (tblИзмерения и tblData). Как сделать, что бы результат был как в случае двух запросов?
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
06.07.2015, 13:25 |
Помогаю со студенческими работами здесь LEFT JOIN + LIKE Проблемы с LEFT JOIN Left join + подзапрос Пишу Вам уже почти отчаявшись. Уж просветите неуча… в Аксессе… Непонятки с left join связываю запрос и таблицу, в результат rec.eof =… Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
Обновлено 09.12.2019
Вопрос:
Когда я запускаю это, появляется сообщение об ошибке. Ты знаешь почему? Я построил его, используя представление Access.
SELECT [Sales structure].Cluster ,
[Sales structure].Country ,
[Transaction details].[Sales company code] ,
[Sales structure].[Sales company name] ,
YEAR([Transaction details].[YYYY-MM-DD]) AS [Year] ,
MONTH([Transaction details].[YYYY-MM-DD]) AS [Month] ,
SUM([Transaction details].[Sales volume LOC]) AS Total ,
[Transaction details].[Currency code] ,
Currencies.[CUR/EUR] AS [Currency rate]
FROM Items ,
Currencies
RIGHT JOIN ( [Sales structure]
RIGHT JOIN [Transaction details] ON [Sales structure].[Sales company code] = [Transaction details].[Sales company code]
) ON Currencies.[Currency code] = [Transaction details].[Currency code]
GROUP BY [Sales structure].Cluster ,
[Sales structure].Country ,
[Transaction details].[Sales company code] ,
[Sales structure].[Sales company name] ,
YEAR([Transaction details].[YYYY-MM-DD]) ,
MONTH([Transaction details].[YYYY-MM-DD]) ,
[Transaction details].[Currency code] ,
Currencies.[CUR/EUR]
HAVING ( ([Transaction details].[Currency code] = [Currencies].[Currency code]) )
ORDER BY YEAR([Transaction details].[YYYY-MM-DD]) ,
MONTH([Transaction details].[YYYY-MM-DD]) ;
Ответ №1
Не существует условия JOIN
между таблицами Items
и Currencies
. Они просто вводятся с запятой.
MS Access очень относится к объединениям. Вы также можете поместить круглые скобки вокруг каждого соединения, так как он может иметь коннекты о отсутствующих круглых скобках, даже если запрос синтаксически корректен без них.
Я настоятельно призываю вас забыть, что вы можете присоединиться таблицы, используя запятую ,
и через ввод условий соединения в WHERE
пункта. Это старый стиль, и его нужно оставить! Пожалуйста, начните использовать соединения ANSI SQL, которые вводятся (после первой таблицы) с предложением JOIN
и объединены с предложением ON
. Есть много веских причин для этого – просто выполните некоторые поисковые запросы в Интернете, если хотите понять больше.