Невозможно выполнить инструкцию sql так как запрос содержит неоднозначные внешние соединения

Access для Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Еще…Меньше

Видео:

Браузер не поддерживает видео.

В этом видео

Сообщение «Неоднозначное внешнее присоединение» появляется, когда Access определяет, что запрос может давать разные результаты в зависимости от того, какое присоединение было сделано в первую очередь. Чтобы выполнить запрос, необходимо внести некоторые изменения. Лучше всего разделить запрос на части. Это значит, что по крайней мере одно из запросов можно создать с помощью небольших «детей», которые затем будут соединяться с другими таблицами или запросами в родительском запросе. Затем Access сначала выполняет их в запросе (или запросе) ребенка, а затем выполняет их в родительском запросе в последнюю очередь, устраняя неоднозначность.

В зависимости от количества таблиц в запросе может потребоваться создать несколько детских запросов, чтобы избежать неоднозначных внешних запросов. В этом видео показан простой пример из трех таблиц, в котором две равносвязаные таблицы разделены на запросы ребенка, а внешнее соединиться с третьей таблицей — в родительском запросе. Ниже ряду основных действий предполагается, что вы уже знакомы с созданием простого запроса на выборки:

  1. Создайте запрос для ребенка, содержащий таблицы, к которые нужно сначала присоединить (в видеоролике это таблицы «Компании» и «Люди»).

  2. В запросе дважды щелкните необходимые выходные поля, чтобы они появились в сетке запроса.

Важно:  Не забудьте включить поле для join из исходного запроса. В примере с видео компании присоединились к регионам с помощью поля RegionID, поэтому мы включаем RegionID в сетку запроса для ребенка запроса.

  1. Сохраните и закройте запрос ребенка, а затем откройте исходный запрос в конструкторе. Это будет родительский запрос.

  2. Удалите таблицы, добавленные в запрос ребенка, а затем добавьте запрос «ребенок»(«Конструктор > Добавление таблиц»(«Добавление таблицы» в Access 2013 )> «Запросы»или просто перетащите в родительский запрос запрос из области навигации).

  3. В родительском запросе создайте такое же, как и раньше, только на этот раз для запроса ребенка.

  4. Добавьте выходные поля запроса в сетку запроса.

  5. Сохраните и запустите родительский запрос.

Правило при неоднозначных внешних соединителах

Неоднозначные внешние соединителения возникают, если в запросе есть несколько таких соединителиков, одно из которых — внешнее, которое указывает на 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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Такой запрос работает

T-SQL
1
2
3
4
5
6
7
8
9
10
SELECT tblСЭТ.fldIdСЭТ, tblСЭТ.fldТочкаУчета, tblСЭТ.fldТипСЭТ,
 tblСЭТ.fldSerNum, tblИзмерения.fldАтрибуты4,
 tblИзмерения.fldАтрибуты6, tblData.fldData0, tblData.fldData2
 
FROM (tblСЭТ
 INNER JOIN tblИзмерения ON tblСЭТ.fldIdСЭТ = tblИзмерения.fldIdСЭТ)
 INNER JOIN tblData ON tblИзмерения.fldIdIzm = tblData.fldIdIzm
 
WHERE (((tblИзмерения.fldАтрибуты6)="17.06.15"))
;

А такой не работает

T-SQL
1
2
3
4
5
6
7
8
9
SELECT tblСЭТ.fldIdСЭТ, tblСЭТ.fldТочкаУчета, tblСЭТ.fldТипСЭТ,
 tblСЭТ.fldSerNum, tblИзмерения.fldАтрибуты4,
 tblИзмерения.fldАтрибуты6, tblData.fldData0, tblData.fldData2
 
FROM (tblСЭТ
 LEFT JOIN tblИзмерения ON tblСЭТ.fldIdСЭТ = tblИзмерения.fldIdСЭТ)
 INNER JOIN tblData ON tblИзмерения.fldIdIzm = tblData.fldIdIzm
WHERE (((tblИзмерения.fldАтрибуты6)="17.06.15"))
;

Выходит сообщение:

Невозможно выполнить инструкцию SQL, так как запрос содержит неоднозначные внешние соединения. Для явного указания соединения, выполняемого первым, создайте отдельный запрос и включите его в инструкцию SQL.

На два запроса я могу разбить, но мне нужно одним, т.к. обращение к базе будет из Delphi. Подскажите, как это сделать?

Вложения

Тип файла: rar Test.rar (23.4 Кб, 8 просмотров)



0



texnik-san

шапоклякистка 8-го дня

3676 / 2236 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

02.07.2015, 16:41

2

Просто заменить INNER JOIN на еще один LEFT JOIN.

SQL
1
2
3
4
5
6
7
8
9
SELECT tblСЭТ.fldIdСЭТ, tblСЭТ.fldТочкаУчета, tblСЭТ.fldТипСЭТ,
 tblСЭТ.fldSerNum, tblИзмерения.fldАтрибуты4 AS Kimp, tblИзмерения.fldАтрибуты6,
 Mid(tblData.fldData0,InStr(tblData.fldData0,"  ")-8,8)/(Kimp*2) AS [P+],
 Mid(tblData.fldData2,InStr(tblData.fldData2,"  ")-8,8)/(Kimp*2) AS [Q+]
FROM (tblСЭТ
 LEFT JOIN tblИзмерения ON tblСЭТ.fldIdСЭТ = tblИзмерения.fldIdСЭТ)
 LEFT JOIN tblData ON tblИзмерения.fldIdIzm = tblData.fldIdIzm
WHERE (((tblИзмерения.fldАтрибуты6)="17.06.15"))
;



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.

SQL
1
2
3
SELECT tblСЭТ.fldIdСЭТ, tblСЭТ.fldТочкаУчета, tblСЭТ.fldТипСЭТ, tblСЭТ.fldSerNum, tblИзмерения.fldАтрибуты4 AS Kimp, tblИзмерения.fldАтрибуты6, IIf(NOT IsNull([Kimp]),Mid([tblData].[fldData0],InStr([tblData].[fldData0],"  ")-8,8)/([Kimp]*2),NULL) AS [P+], IIf(NOT IsNull([Kimp]),Mid([tblData].[fldData2],InStr([tblData].[fldData2],"  ")-8,8)/([Kimp]*2),NULL) AS [Q+]
FROM (tblСЭТ LEFT JOIN tblИзмерения ON tblСЭТ.fldIdСЭТ = tblИзмерения.fldIdСЭТ) LEFT JOIN tblData ON tblИзмерения.fldIdIzm = tblData.fldIdIzm
WHERE (((tblИзмерения.fldАтрибуты6)="17.06.15" OR (tblИзмерения.fldАтрибуты6) IS NULL));



1



Эксперт MS Access

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

Что-то здесь не то?
На реальной базе, если делаю через два запроса получается правильный результат. Вот запросы:

T-SQL
1
2
3
4
5
SELECT tIzm.fldIdСЭТ, tIzm.fldАтрибуты4 AS Kimp, tIzm.fldАтрибуты6 AS DateIzm, 
IIf(Not IsNull([Kimp]),Mid(tD.fldData0,InStr(tD.fldData0,"  ")-8,8)/(Kimp*2),Null) AS [P+], 
IIf(Not IsNull([Kimp]),Mid(tD.fldData2,InStr(tD.fldData2,"  ")-8,8)/(Kimp*2),Null) AS [Q+]
FROM tblИзмерения AS tIzm INNER JOIN tblData AS tD ON tIzm.fldIdIzm = tD.fldIdIzm
WHERE (((tIzm.fldАтрибуты6)="17.06.15"));
T-SQL
1
2
SELECT tblСЭТ.fldТочкаУчета, tblСЭТ.fldТипСЭТ, tblСЭТ.fldSerNum, qIzmEnerg.Kimp, qIzmEnerg.DateIzm, qIzmEnerg.[P+], qIzmEnerg.[Q+]
FROM tblСЭТ LEFT JOIN qIzmEnerg ON tblСЭТ.fldIdСЭТ = qIzmEnerg.fldIdСЭТ;

Но если делаю одним запросом, то левая половина (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
мне надо получить данные с помощью 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. Есть много веских причин для этого – просто выполните некоторые поисковые запросы в Интернете, если хотите понять больше.

Понравилась статья? Поделить с друзьями:
  • Невис актив таблетки инструкция по применению
  • Невролог инструкция по применению цена в казахстане уколы
  • Невис актив таблетки для детей инструкция
  • Невролек таблетки успокаивающие инструкция по применению
  • Невис актив капли для детей инструкция по применению отзывы