Kav-soft.ru

ПК Софт
8 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access left join

Access left join

Возможен ли запрос в Акцесс (доступ через JET) такого вида

FROM tbl1
LEFT JOIN tbl2 ON условие
LEFT JOIN tbl3 ON условие

По документации на JET вроде только для INNER JOIN


sniknik © ( 2008-01-18 10:58 ) [1]

а чего нет? главное соблюдать синтаксис со вложенностями джойнов как в справке описано. (тут, в вопросе, он неправильный)


sniknik © ( 2008-01-18 11:04 ) [2]

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


Евгений Р. ( 2008-01-18 11:08 ) [3]

А чот в синтаксисе не так?


sniknik © ( 2008-01-18 11:12 ) [4]

документация или F1 в самом access-е.


MsGuns © ( 2008-01-18 11:23 ) [5]

FROM tbl1
((LEFT JOIN tbl2 ON условие)
LEFT JOIN tbl3 ON условие)
LEFT JOIN tbl4 ON условие


MsGuns © ( 2008-01-18 11:27 ) [6]

>sniknik © (18.01.08 11:04) [2]
>и кстати, в самом access-е (программе) есть неплохой мастер (конструктор) по составлению запросов.

«Какая гадость ! Какая гадость эта ваша заливная рыба» (с)
;))


sniknik © ( 2008-01-18 11:38 ) [7]

гадость, не гадость, а набросать «черновик» и/или посмотреть синтаксис позволяет, у многих и такого нет.


Евгений Р. ( 2008-01-18 12:02 ) [8]


> документация или F1 в самом access-е.

С access не работал, отличается от стандартной?


Anatoly Podgoretsky © ( 2008-01-18 12:18 ) [9]


> документация или F1 в самом access-е.

Документация по JETSQL молчит об этом, а документации по Акцесс или самого Акцесса у меня нет.


Евгений Р. ( 2008-01-18 12:29 ) [10]

В LocalSQL и FB использую постоянно именно такой синтаксис. Проблем нет. Ну а с Акцесс не сталкивался


Anatoly Podgoretsky © ( 2008-01-18 12:35 ) [11]


> MsGuns © (18.01.08 11:23) [5]
> FROM tbl1
> ((LEFT JOIN tbl2 ON условие)
> LEFT JOIN tbl3 ON условие)
> LEFT JOIN tbl4 ON условие

Не фига такой синтаксис не работает, даже

FROM tbl1
(LEFT JOIN tbl2 ON условие)

сразу ругается на ошибку синтаксиса в FROM
и также на

FROM tbl1
((LEFT JOIN tbl2 ON условие)
LEFT JOIN tbl3 ON условие)


Евгений Р. ( 2008-01-18 12:46 ) [12]

В LocalSQL и FB

from t1
left join t2
on t1.fld1=t2.fld1
left join t3
on t3.fld1=t2.fld1 and t3.fld2=t1.fld5

К статьи, не знаю как по теории, но если в t2 окажется несколько записей с критерием t1.fld1=t2.fld1, то в выборке будет 2 строки


sniknik © ( 2008-01-18 12:51 ) [13]

> Не фига такой синтаксис не работает
должен, по сути, только MsGuns скобочки неправильно расставил (надо было смотреть в справке по INNER JOIN)

вот так правильнее
FROM
(tbl1 LEFT JOIN tbl2 ON условие) LEFT JOIN tbl3 ON условие


Евгений Р. ( 2008-01-18 13:06 ) [14]

Вот первый попавшийся кусок живого текста из FB

select sp.kNom,sp.nMesta,sp.mest,sk.mest as mst
from asPos sp
left join sNom sn
on sn.knom=sp.knom
left join sKatNom sk
on sk.kod=sn.kkat
where idfd=6338

KNOM NMESTA MEST MST
416 0 2 2
418 0 2 2
435 1 1 2
437 0 2 2
324 0 2 2


Anatoly Podgoretsky © ( 2008-01-18 13:43 ) [15]


> FROM
> (tbl1 LEFT JOIN tbl2 ON условие) LEFT JOIN tbl3 ON условие

Другое дело, как только я не ставил скобки, но не догадался после FROM
Теперь работает.


ANTPro © ( 2008-01-18 13:50 ) [16]

SELECT Таблица1.Код, Таблица2.название11, Таблица3.название22
FROM Таблица3
INNER JOIN (Таблица2 INNER JOIN Таблица1 ON Таблица2.Код = Таблица1.Название1) ON Таблица3.Код = Таблица1.Название2;

Access 2007


MsGuns © ( 2008-01-18 14:53 ) [17]

Невнимательно просмотрел что набрал (копипас гробит нас ;))
Синтаксис такой или почти такой как в Local SQL

Анатолий, а можно было вложенными сделать:
Select from t3 left join
(Select from t1 left join t2 on) on ..

А вот такой номер в локале нем прокатит 😉


Anatoly Podgoretsky © ( 2008-01-18 15:41 ) [18]


> Анатолий, а можно было вложенными сделать:

Можно, но я предпочитаю быструю работу, метод предложенный sniknik работает.
Меня другое волнует, неужели я так плохо читаю документацию, что не нашел такого примера. Я навсякий случай просмотрел пример и по INNER JOIN ну нет такого синтаксиса и даже намека на него.

Читайте так же:
Как узнать версию майкрософт офис


eddoc ( 2008-01-21 13:55 ) [19]

>>Меня другое волнует, неужели я так плохо читаю документацию, что не нашел такого примера.

Анатолий, «. ну вы, блин, даете!» (с)
Я около 1,5 лет назад задавал подобный вопрос на форуме скул.ру — и до сих пор считал автором правильного ответа именно Вас 🙂


Anatoly Podgoretsky © ( 2008-01-21 18:48 ) [20]

> eddoc (21.01.2008 13:55:19) [19]

Так это когда было 🙂
А вопрос точно такой был?
Просто я дернулся в справку а там ничего нет.

MS Access Left Join не работает правильно

Я пытаюсь написать запрос в MS Access 2013 и левое соединение не работает правильно. Он действует как обычный join.

Вот что я пытаюсь сделать.

Моя первая таблица [All Category Types] имеет один столбец [Category Types] . Затем я пытаюсь соединить это с запросом, в котором есть два агрегатных поля. Виртуальная таблица [Average by Category Type] сначала группируется по владельцу, а затем по [Category Type] . Далее идет поле суммы [CountOfIncident: Number] .

То, что я хочу в результате, — это каждый элемент в таблице [All Category Types] , а затем правильный [CountOfIncident: Number] where Owner == «France» . Это не работает как левое соединение. Он только показывает мне значения в [All Category Types] , которые имеют соответствующую запись в [Average by Category Type] .

Если я удаляю владельца из этой таблицы и только группирую по [Category Type] , он работает просто отлично. Есть ли что-то о наличии более одного поля в предложении group by, которое не позволяет левому соединению в запросе работать правильно?

2 Ответа

[Average by Category Type].Owner = «France» может быть истинным только для внутренних Соединенных записей. Для внешних Соединенных записей [Average by Category Type].Owner равно null.

Таким образом, ваше предложение WHERE превращает ваше внешнее соединение во внутреннее соединение. Переместите условие в предложение ON :

UPDATE: в отличие от других СУБД MS Access нуждается в скобках для предложения ON : JOIN tablename ON (. ) , а не JOIN tablename ON . .

Утверждение Торстена Кеттнера верно, что предложение WHERE по существу превратило утверждение в эквивалент внутреннего соединения.

Ключ к тому, чтобы заставить левое соединение работать, — это понимание порядка, в котором применяются критерии. Критерии JOIN всегда применяются первыми, затем предложение WHERE применяется после объединения всех записей. Поскольку в левом соединении вы хотите получить все записи из левой таблицы независимо от того, выполняется ли условие соединения, вы должны убедиться, что все условия применяются либо BEFORE, либо как часть условия соединения.

Если вы можете получить ответ Торстена, чтобы работать со всеми условиями в соединении, я предлагаю этот подход. Но в случае, если у вас есть проблемы (весьма вероятно, с доступом), вы также можете применить некоторые условия в подзапросе или добавив критерии WHERE в сохраненный запрос [среднее значение по типу категории]. Возможно, это очевидно, но в контексте приведенного выше объяснения порядка выполнения подзапрос-включая любую фильтрацию в предложении WHERE-завершается до применения левого соединения.

Похожие вопросы:

Это действительно трудно для меня, чтобы уладить эту проблему. Я пробовал все возможные комбинации на FROM части, но я не могу, кажется, получить его. Я пробовал запятую, смешивая inner join &.

Мне нужна помощь в преобразовании этого запроса T-SQL в MS ACCESS. Ошибка, которую я получаю, — это выражение JOIN не поддерживается. Обновление: Я не могу добавить: DDA НА TT.[Description] =.

Следующий запрос left join в MS Access 2007 SELECT Table1.Field_A, Table1.Field_B, qry_Table2_Combined.Field_A, qry_Table2_Combined.Field_B, qry_Table2_Combined.Combined_Field FROM Table1 LEFT JOIN.

Может ли кто-нибудь найти, что не так с этим запросом MS Access? Когда я пытаюсь выполнить его, я получаю сообщение об ошибке о недостающем операторе перед 2-м левым соединением SELECT * FROM (.

Я написал запрос SQL, который делает то, что я хочу: SELECT Tag.ID, Tag.Type, COUNT(Cable.Type) FROM Tag LEFT JOIN Cable ON (Cable.Type = Tag.Type AND Cable.Use = KW) GROUP BY TagID, Tag.Type.

Следующий запрос SQL не возвращает данных для LEFT JOIN в MS Access . SELECT * FROM ( SELECT Operation_Part.PPC, Operation_Part.TargetOperationsPerHour as JPH, Operation_Part.Misc1 as [JPh Alt 1].

Отличаются ли обычные запросы sql от запросов MS Access 2007? У меня есть этот простой запрос, но он не работает в MS Access query (SQL View). Что в этом плохого? SELECT StudentSubject.*.

Прочитайте документацию MS Access, чтобы узнать, как выполнить операцию LEFT JOIN sql. Я смотрел на свой запрос в течение одного часа, не будучи в состоянии определить проблему. SELECT gen_id_id.

Я должен выполнить следующий запрос в базе данных access: SELECT School.Name, Student.Name, Grade.Grade FROM( (`School` `School` LEFT JOIN `Student` `Student` ON `School`.`ID`=`Student`.`SchoolID`).

Я конвертирую свою базу данных с сервера SQL на MS Access. Этот запрос отлично работает на сервере SQL, но он имеет синтаксическую ошибку в MS-Access. Так что же не так с этим утверждением SQL.

Читайте так же:
Как переустановить офис ворд

MS Access Left Join не работает правильно

Я пытаюсь написать запрос в MS Access 2013 и левое соединение не работает правильно. Он действует как обычный join.

Вот что я пытаюсь сделать.

Моя первая таблица [All Category Types] имеет один столбец [Category Types] . Затем я пытаюсь соединить это с запросом, в котором есть два агрегатных поля. Виртуальная таблица [Average by Category Type] сначала группируется по владельцу, а затем по [Category Type] . Далее идет поле суммы [CountOfIncident: Number] .

То, что я хочу в результате, — это каждый элемент в таблице [All Category Types] , а затем правильный [CountOfIncident: Number] where Owner == «France» . Это не работает как левое соединение. Он только показывает мне значения в [All Category Types] , которые имеют соответствующую запись в [Average by Category Type] .

Если я удаляю владельца из этой таблицы и только группирую по [Category Type] , он работает просто отлично. Есть ли что-то о наличии более одного поля в предложении group by, которое не позволяет левому соединению в запросе работать правильно?

2 Ответа

[Average by Category Type].Owner = «France» может быть истинным только для внутренних Соединенных записей. Для внешних Соединенных записей [Average by Category Type].Owner равно null.

Таким образом, ваше предложение WHERE превращает ваше внешнее соединение во внутреннее соединение. Переместите условие в предложение ON :

UPDATE: в отличие от других СУБД MS Access нуждается в скобках для предложения ON : JOIN tablename ON (. ) , а не JOIN tablename ON . .

Утверждение Торстена Кеттнера верно, что предложение WHERE по существу превратило утверждение в эквивалент внутреннего соединения.

Ключ к тому, чтобы заставить левое соединение работать, — это понимание порядка, в котором применяются критерии. Критерии JOIN всегда применяются первыми, затем предложение WHERE применяется после объединения всех записей. Поскольку в левом соединении вы хотите получить все записи из левой таблицы независимо от того, выполняется ли условие соединения, вы должны убедиться, что все условия применяются либо BEFORE, либо как часть условия соединения.

Если вы можете получить ответ Торстена, чтобы работать со всеми условиями в соединении, я предлагаю этот подход. Но в случае, если у вас есть проблемы (весьма вероятно, с доступом), вы также можете применить некоторые условия в подзапросе или добавив критерии WHERE в сохраненный запрос [среднее значение по типу категории]. Возможно, это очевидно, но в контексте приведенного выше объяснения порядка выполнения подзапрос-включая любую фильтрацию в предложении WHERE-завершается до применения левого соединения.

Похожие вопросы:

Это действительно трудно для меня, чтобы уладить эту проблему. Я пробовал все возможные комбинации на FROM части, но я не могу, кажется, получить его. Я пробовал запятую, смешивая inner join &.

Мне нужна помощь в преобразовании этого запроса T-SQL в MS ACCESS. Ошибка, которую я получаю, — это выражение JOIN не поддерживается. Обновление: Я не могу добавить: DDA НА TT.[Description] =.

Следующий запрос left join в MS Access 2007 SELECT Table1.Field_A, Table1.Field_B, qry_Table2_Combined.Field_A, qry_Table2_Combined.Field_B, qry_Table2_Combined.Combined_Field FROM Table1 LEFT JOIN.

Может ли кто-нибудь найти, что не так с этим запросом MS Access? Когда я пытаюсь выполнить его, я получаю сообщение об ошибке о недостающем операторе перед 2-м левым соединением SELECT * FROM (.

Я написал запрос SQL, который делает то, что я хочу: SELECT Tag.ID, Tag.Type, COUNT(Cable.Type) FROM Tag LEFT JOIN Cable ON (Cable.Type = Tag.Type AND Cable.Use = KW) GROUP BY TagID, Tag.Type.

Следующий запрос SQL не возвращает данных для LEFT JOIN в MS Access . SELECT * FROM ( SELECT Operation_Part.PPC, Operation_Part.TargetOperationsPerHour as JPH, Operation_Part.Misc1 as [JPh Alt 1].

Отличаются ли обычные запросы sql от запросов MS Access 2007? У меня есть этот простой запрос, но он не работает в MS Access query (SQL View). Что в этом плохого? SELECT StudentSubject.*.

Прочитайте документацию MS Access, чтобы узнать, как выполнить операцию LEFT JOIN sql. Я смотрел на свой запрос в течение одного часа, не будучи в состоянии определить проблему. SELECT gen_id_id.

Я должен выполнить следующий запрос в базе данных access: SELECT School.Name, Student.Name, Grade.Grade FROM( (`School` `School` LEFT JOIN `Student` `Student` ON `School`.`ID`=`Student`.`SchoolID`).

Я конвертирую свою базу данных с сервера SQL на MS Access. Этот запрос отлично работает на сервере SQL, но он имеет синтаксическую ошибку в MS-Access. Так что же не так с этим утверждением SQL.

Язык SQL – объединение JOIN

Продолжаем изучать основы SQL, и пришло время поговорить о простых объединениях JOIN. И сегодня мы рассмотрим, как объединяются данные по средствам операторов LEFT JOIN, RIGHT JOIN, CROSS JOIN и INNER JOIN, другими словами, научимся писать запросы, которые объединяют данные, и как обычно изучать все это будем на примерах.

Объединения JOIN очень важны в SQL, так как без умения писать запросы с объединением данных разных объектов, просто не обойтись программисту SQL, да и просто админу который время от времени выгружает какие-то данные из базы данных, поэтому это относится к основам SQL и каждый человек, который имеет дело с SQL, должен иметь представление, что это такое.

Читайте так же:
Активация офис по телефону номер

Примечание! Все примеры будем писать в Management Studio SQL Server 2008.

Мы с Вами уже давно изучаем основы SQL, и если вспомнить начинали мы с оператора select, и вообще было уже много материала на этом сайте по SQL, например:

И много другого, даже уже рассматривали объединения union и union all, но, так или иначе, более подробно именно об объединениях join мы с Вами не разговаривали, поэтому сегодня мы восполним этот пробел в наших знаниях.

И начнем мы как обычно с небольшой теории.

Объединения JOIN — это объединение двух или более объектов базы данных по средствам определенного ключа или ключей или в случае cross join и вовсе без ключа. Под объектами здесь подразумевается различные таблицы, представления (views), табличные функции или просто подзапросы sql, т.е. все, что возвращает табличные данные.

Объединение SQL LEFT и RIGHT JOIN

LEFT JOIN – это объединение данных по левому ключу, т.е. допустим, мы объединяем две таблицы по left join, и это значит что все данные из второй таблицы подтянутся к первой, а в случае отсутствия ключа выведется NULL значения, другими словами выведутся все данные из левой таблицы и все данные по ключу из правой таблицы.

RIGHT JOIN – это такое же объединение как и Left join только будут выводиться все данные из правой таблицы и только те данные из левой таблицы в которых есть ключ объединения.

Теперь давайте рассматривать примеры, и для начала создадим две таблицы:

Вот такие простенькие таблицы, И я для примера заполнил их вот такими данными:

Теперь давайте напишем запрос с объединением этих таблиц по ключу number, для начала по LEFT:

Как видите, здесь данные из таблицы t1 вывелись все, а данные из таблицы t2 не все, так как строки с number = 4 там нет, поэтому и вывелись NULL значения.

А что будет, если бы мы объединяли по средствам right join, а было бы вот это:

Другими словами, вывелись все строки из таблицы t2 и соответствующие записи из таблицы t1, так как все те ключи, которые есть в таблице t2, есть и в таблице t1, и поэтому у нас нет NULL значений.

Объединение SQL INNER JOIN

Inner join – это объединение когда выводятся все записи из одной таблицы и все соответствующие записи из другой таблице, а те записи которых нет в одной или в другой таблице выводиться не будут, т.е. только те записи которые соответствуют ключу. Кстати сразу скажу, что inner join это то же самое, что и просто join без Inner. Пример:

А теперь давайте попробуем объединить наши таблицы по двум ключам, для этого немного вспомним, как добавлять колонку в таблицу и как обновить данные через update, так как в наших таблицах всего две колонки, и объединять по текстовому полю как-то не хорошо. Для этого добавим колонки:

Обновим наши данные, просто проставим в колонку number2 значение 1:

И давайте напишем запрос с объединением по двум ключам:

И результат будет таким же, как и в предыдущем примере:

Но если мы, допустим во второй таблице в одной строке изменим, поле number2 на значение скажем 2, то результат будет уже совсем другой.

Запрос тот же самый, а вот результат:

Как видите, по второму ключу у нас одна строка не вывелась.

Объединение SQL CROSS JOIN

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

Здесь у нас каждой строке таблицы test_table соответствует каждая строка из таблицы test_table_2, т.е. в таблице test_table у нас 4 строки, а в таблице test_table_2 3 строки 4 умножить 3 и будет 12, как и у нас вывелось 12 строк.

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

Как видите, я здесь объединяю и по left и по right и по inner просто, для того чтобы это было наглядно.

С объединениями я думаю достаточно, тем более ничего сложного в них нет. Но на этом изучение SQL не закончено в следующих статьях мы продолжим, а пока тренируйтесь и пишите свои запросы. Удачи!

Читайте так же:
Как установить мс офис

Заметка! Если Вас интересует SQL и T-SQL, рекомендую пройти наши курсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать с использованием языка T-SQL в Microsoft SQL Server.

MS Access Left Join not working correctly

I am trying to write a query in MS Access 2013 and the left join is not working correctly. It is acting like a normal join.

Here is what I’m trying to do.

My first table [All Category Types] has one column [Category Types] . I am then trying to left join that to a query that has two aggregate fields in it. Virtual Table [Average by Category Type] is first grouped by Owner, and then by [Category Type] . Next is a sum field [CountOfIncident: Number] .

What I want as a result is every item in table [All Category Types] and then the correct [CountOfIncident: Number] where Owner == «France» . This is not working as a left join. It is only showing me the values in [All Category Types] that have a matching record in [Average by Category Type] .

If I remove Owner from this table, and only group by [Category Type] , it works just fine. Is there something about having more than one field in the group by clause that does not allow a left join on a query to work correctly?

My 5c: I find queries less readable when the columns contain blanks and must be escaped. Why not simply ‘SELECT all_category_types.category_type’? I also find queries less readable when multiple tables are involved, but no table aliases used (e.g. ‘SELECT ct.category_type’). I also find queries less readable that have a lot of superfluous parentheses. Why not simply ‘WHERE [Average by Category Type].Owner = «France»‘? At last I’d prefer to use standard SQL wherever possible. That would be single quotes for string literals: ‘= ‘France». – Thorsten Kettner 12 сен. 17 2017-09-12 21:30:31

2 ответа

[Average by Category Type].Owner = «France» can only be true for inner joined records. For outer joined records [Average by Category Type].Owner is null.

So your WHERE clause turns your outer join into an inner join. Move the condition to the ON clause:

UPDATE: Unlike other DBMS MS Access needs parentheses for the ON clause: JOIN tablename ON (. ) rather than JOIN tablename ON . .

Was just about to propose the same. You can change that ‘WHERE’ statement to ‘WHERE ((([Average by Category Type].Owner)=»France»)) OR [Average by Category Type].Owner IS NULL’ – Erik von Asmuth 12 сен. 17 2017-09-12 21:17:37

@Erik von Asmuth: It’s better to move the condition to the ‘ON’ clause where it belongs. I’ve updated my answer accordingly. – Thorsten Kettner 12 сен. 17 2017-09-12 21:18:27

Not for MS Access. It tends to run into trouble with such comparisons in the ‘ON’ clause (for starters, the query builder won’t work anymore, but had queries fail on me when I did that (JOIN expression not supported, Access is picky in its joins)). For other RDBMSes you’re right. – Erik von Asmuth 12 сен. 17 2017-09-12 21:20:49

Again and again, I am sooo glad, I don’t have to work with MS Access. I had to many years ago and it was horrible due to all its limitations. And from what I read it still seems to be about the worst DBMS on the market. – Thorsten Kettner 12 сен. 17 2017-09-12 21:25:07

See https://stackoverflow.com/questions/16608313/join-expression-not-supported-in-access for a question that does a join like you intend to do, and fails, because you can’t do that in Access. – Erik von Asmuth 12 сен. 17 2017-09-12 21:29:02

MS Access is nasty when it comes to joins, I know. Most often it’s about putting many seemingly superfluous parentheses where Access wants to have them 🙁 In the link’s query that may be a cause. Another may be the missing alias name for the derived table. – Thorsten Kettner 12 сен. 17 2017-09-12 21:36:04

After all of the fuss about formatting and extra parenthesis, the lone parenthesis in the last expression is screaming to be removed. – C Perkins 15 сен. 17 2017-09-15 05:15:26

@ErikvonAsmuth The suggested WHERE clause will not work since it still excludes rows where this is match but Owner is not ‘France’. Although the join in Thorsten’s answer won’t work in Access, it at least would produce the correct result if Access did support the join. In the end, none of these suggestions actually answer the question correctly. – C Perkins 15 сен. 17 2017-09-15 05:27:43

Читайте так же:
Какой офис ставить

@CPerkins I can easily modify my approach to do the same as the join, but the asker hasn’t responded, and I’m not 100% sure that’s what he wants – Erik von Asmuth 15 сен. 17 2017-09-15 05:41:48

@ErikvonAsmuth Definitely it’s best if the asker responds. But the last few statements imply that he wants what Thorsten’s answer would give. Also in this case, the other linked SO answer is also not immediately helpful since it deals only with INNER JOINS. In this case the asker needs a subquery (or to edit the [Average by Category Type] query) to filter on Owner before the LEFT JOIN. I was going to submit an alternative answer unless you already had that in mind. – C Perkins 15 сен. 17 2017-09-15 05:51:38

@C Perkins: Thanks for mentioning the parenthesis I had too may. I tried my query in MS Access now and it shows that Access needs parentheses around the ‘ON’ criteria. I’ve updated my answer. The corrected query works properly in my tests. – Thorsten Kettner 15 сен. 17 2017-09-15 05:53:05

@ThorstenKettner I hate Access. If your query really works then I give up. I thought I had just about figured out what kind of join expressions Access allows and I was certain it would not accept literals like that. I almost wanted to defend Access earlier, but perhaps you’re right about how bad it is. I just wish there was another DBMS that would do the few things Access does well. – C Perkins 15 сен. 17 2017-09-15 06:00:36

Thorsten Kettner’s statement is correct that the WHERE clause has essentially turned the statement into the equivalent of an INNER JOIN.

The key to making the LEFT JOIN work is understanding the order in which criteria are applied. JOIN criteria are always applied first, then the WHERE clause is applied after all records are joined. Since in a LEFT JOIN you want all records from the left table regardless of whether the join condition is satisfied, you must ensure that all conditions are applied either BEFORE or as part of the join condition.

If you can get Thorsten’s answer to work with all conditions in the join, I suggest that approach. But in case you have problems (highly likely with Access) then you can also apply some of the conditions in a subquery or by adding WHERE criteria within the saved query [Average by Category Type]. Perhaps it is obvious but in context of the above explanation regarding order of execution, the subquery —including any filtering in the WHERE clause— is completed before the LEFT JOIN is applied.

Создан 15 сен. 17 2017-09-15 06:10:59 C Perkins

I could actually get the most recent edit of Thorsten Kettner’s answer to work on a sample database. Perhaps remove the part about his question. – Erik von Asmuth 15 сен. 17 2017-09-15 09:32:33

@ErikvonAsmuth Well, in this exact case I also got it to work. But even your discussion with Thorsten revealed that it can often be difficult with Access to get the parenthesis correct. In the last month I have had to completely rework two queries because no combination of parenthesis would fix certain join conditions. Since these answers are not just for the original asker’s benefit, I think a reference to the other answer is justified. I’m giving him due credit and upvoted his answer, but this alternative could be critical in other cases. – C Perkins 15 сен. 17 2017-09-15 13:40:54

Note that you can always go the horrible way: ‘ON [Average by Category Type].[Category Type] = [All Category Types].[Category Type] AND [Average by Category Type].Owner = Right([All Category Types].[Category Type] & «France», 6)’ works fine without any extra parentheses – Erik von Asmuth 15 сен. 17 2017-09-15 14:15:16

That’s the trick I had used in the past. I thought it was required to reference one of the tables on both sides of the logic operator, but apparently not always. My problem earlier was a join using the Between operator with dates. It was working great with no problems, but then I added just _one more column_ to my query from an existing table already in the query, I think another date value. with no name conflicts, no grouping problems, nothing. Suddenly I was getting duplicate alias errors and unsupported join errors. Nothing worked but to use basic joins with subqueries. – C Perkins 15 сен. 17 2017-09-15 15:54:29

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector