Access 2007 - при левом присоединении к запросу возвращается #Error вместо Null
Аналогично этому вопросу, но проблема с запросом так и не была полностью решена:
Я получаю #Error, когда я 'ожидая увидеть нулевое значение при выполнении левого соединения, где нет соответствующей записи в правой части соединения:
Chain CasesPerMonthPerStore MonthOfFirstOrder
Naturally 2.3 5/1/2011
Tom's Market #Error
Livingstons #Error
EverClear 3.1 7/1/2012
Bob's Market 2.66 5/1/2012
Andy's Exports #Error
Jamestowns 0.89 7/1/2012
Это прекрасно работает, если я скопирую данные в таблицу и оставлю соединение с этой таблицей, поэтому я предполагаю, что в синтаксисе запроса что-то не так:
SELECT
MonthRange.Chain,
MonthRange.CasesShipped/IIf(MonthsSinceFirstOrder.Months>DateDiff("m",QueryDates.StartDate,QueryDates.EndDate)+1,
DateDiff("m",QueryDates.StartDate,QueryDates.EndDate)+1,
MonthsSinceFirstOrder.Months)/NumStores.NumberOfStores AS CasesPerMonthPerStore,
MonthsSinceFirstOrder.MonthOfFirstOrder
FROM
QueryDates,
(
MonthRange
INNER JOIN
NumStores
ON MonthRange.Chain=NumStores.Chain
)
INNER JOIN
MonthsSinceFirstOrder
ON MonthRange.Chain=MonthsSinceFirstOrder.Chain;
Этот SQL возвращает правильные результаты, это 'Просто его поведение, когда левый присоединяется к нему, который возвращает #Errors.
Обратите внимание на странный оператор Iif в промежуточных проверках, чтобы увидеть, больше ли количество месяцев с первого заказа, чем количество месяцев, включенных в указанный диапазон дат - так, если диапазон дат имеет 6 месяцев, а первый заказ был за 9 месяцев до дата окончания - 6; если первый заказ был только 4 месяца до даты окончания, он использует 4.
- РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ -
Правильно, я вынул элементы запроса один за другим, и это самое простое, что я могу получить, все еще воссоздав левую ошибку соединения:
SELECT
MonthRange.Chain,
DateDiff("m",QueryDates.StartDate,QueryDates.EndDate)+1 AS CasesPerMonthPerStore
FROM
QueryDates,
MonthRange;
И вот как ям осталось присоединиться к нему:
SELECT
Chains.Chain,
ErrorQuery.CasesPerMonthPerStore
FROM
Chains
LEFT JOIN
ErrorQuery
ON Chains.Chain=ErrorQuery.Chain;
Что-нибудь в этом SQL выглядит неправильно?