Ms access Access 2007-查询的左连接返回错误而不是Null
与此问题类似,但他们的查询问题从未完全解决: 在执行左连接时,如果在连接的右侧没有相应的记录,我希望看到Null,则会出现错误:Ms access Access 2007-查询的左连接返回错误而不是Null,ms-access,ms-access-2007,left-join,Ms Access,Ms Access 2007,Left Join,与此问题类似,但他们的查询问题从未完全解决: 在执行左连接时,如果在连接的右侧没有相应的记录,我希望看到Null,则会出现错误: Chain CasesPerMonthPerStore MonthOfFirstOrder Naturally 2.3 5/1/2011 Tom's Market #Error Livingstons #Error EverClear
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返回正确的结果,返回错误的只是它在加入时的行为
NB,中间的奇怪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中是否有任何错误?看起来可能与Access中的已知错误有关,即它在与计算字段的外部联接上出错: 及 因此,我要看看是否可以重新调整子查询,以某种方式隐藏计算字段
我喜欢上网 这看起来可能与Access中的已知错误有关,即它在与计算字段的外部联接上出错: 及 因此,我要看看是否可以重新调整子查询,以某种方式隐藏计算字段
我喜欢上网 正如Allen Browne在其文章中指出的那样,根据连接类型,查询应该返回Null 相反,它的行为就像[JET查询优化器]在从较低级别的查询返回结果后对表达式求值一样 因此,必须使用表达式选择计算字段,如果联接的右侧与左侧不匹配,该表达式的计算结果将为Null 以精简后的代码为例:
SELECT
Month.Chain,
DateDiff("m",QueryDates.StartDate,QueryDates.EndDate)+1 AS CasesPerMonthPerStore
FROM
QueryDates,
MonthRange;
SELECT
Chains.Chain,
IIf(IsNull(ErrorQuery.Chain),Null,ErrorQuery.CasesPerMonthPerStore)
FROM
Chains
LEFT JOIN
ErrorQuery
ON Chains.Chain=ErrorQuery.Chain;
正如Allen Browne在其文章中指出的那样,根据连接类型,查询应该返回Null 相反,它的行为就像[JET查询优化器]在从较低级别的查询返回结果后对表达式求值一样 因此,必须使用表达式选择计算字段,如果联接的右侧与左侧不匹配,该表达式的计算结果将为Null 以精简后的代码为例:
SELECT
Month.Chain,
DateDiff("m",QueryDates.StartDate,QueryDates.EndDate)+1 AS CasesPerMonthPerStore
FROM
QueryDates,
MonthRange;
SELECT
Chains.Chain,
IIf(IsNull(ErrorQuery.Chain),Null,ErrorQuery.CasesPerMonthPerStore)
FROM
Chains
LEFT JOIN
ErrorQuery
ON Chains.Chain=ErrorQuery.Chain;
这是旧的,但我找到了一个工作,我希望能帮助别人。我对右侧查询也有同样的问题,但我也有一个并行右侧查询,具有类似的数据源和派生,在左侧联接中正常工作。区别在于,在工作右侧和具有简单计算字段的基础查询之间存在联合查询。因此,我将联合查询放在麻烦的右侧查询和最终查询之间,方法是创建一个具有相同字段的空表,并使用该表和原始右侧查询创建一个联合。效果很好。根据Wilskt和Allen Browne提供的信息,我认为工会正在迫使Jet推迟评估。这是一个老问题,但我找到了一个解决办法,希望能对其他人有所帮助。我对右侧查询也有同样的问题,但我也有一个并行右侧查询,具有类似的数据源和派生,在左侧联接中正常工作。区别在于,在工作右侧和具有简单计算字段的基础查询之间存在联合查询。因此,我将联合查询放在麻烦的右侧查询和最终查询之间,方法是创建一个具有相同字段的空表,并使用该表和原始右侧查询创建一个联合。效果很好。根据Wilskt和Allen Browne提供的信息,我认为工会正在迫使Jet推迟评估。我无法用你的最小案例重现这个问题,因为[MonthRange]、[QueryDates]和[Chains]都是表格。在您的案例中,是否有一个已保存的查询?是的,有几个级别的嵌套查询可以达到这个目的。我会检查这些问题,看看是否有什么问题。我过去遇到过一个问题,我在某个字段上分组,然后从Select语句中删除了该字段,但意外地将其留在GROUPBY子句中。Access没有注意到这一点,在大多数情况下它运行良好,但在某些情况下会产生奇怪的结果。如果我能找到问题的症结所在,我会把答案贴在这里,谢谢你花时间检查上面的查询。我无法用你的最小案例来重现这个问题,因为[MonthRange]、[QueryDates]和[Chains]都是表。在您的案例中,是否有一个已保存的查询?是的,有几个级别的嵌套查询可以达到这个目的。我
I’我会检查这些问题,看看是否有什么问题。我过去遇到过一个问题,我在某个字段上分组,然后从Select语句中删除了该字段,但意外地将其留在GROUPBY子句中。Access没有注意到这一点,在大多数情况下它运行良好,但在某些情况下会产生奇怪的结果。如果我找到了答案,我会把答案贴在这里,谢谢你花时间检查上面的查询。RE:以某种方式伪装计算字段-在我在你的示例数据库中重新创建错误后,我也在考虑同样的问题。我的猜测是,计算列是静态的,总是返回相同的值,因此查询优化器短路了外部连接,只为每一行返回该值。无论如何,谢谢你的回复;在我的测试示例中,如果我将计算字段切换为常数,例如3或test,那么该值确实会出现在每个链上,无论它们是否出现在连接的右侧。对于计算字段,它返回了一个错误。只有当它直接引用单个字段时,它才能正常工作。如果我真的解决了这个问题,我会在这里发布解决方法。将其缩小到生成日期的查询,如果您感兴趣,下面的问题就在这里:re:以某种方式伪装计算字段-在示例数据库中重新创建错误后,我也在考虑同样的问题。我的猜测是,计算列是静态的,总是返回相同的值,因此查询优化器短路了外部连接,只为每一行返回该值。无论如何,谢谢你的回复;在我的测试示例中,如果我将计算字段切换为常数,例如3或test,那么该值确实会出现在每个链上,无论它们是否出现在连接的右侧。对于计算字段,它返回了一个错误。只有当它直接引用单个字段时,它才能正常工作。如果我真的解决了,我会在这里发布解决方法。将其缩小到生成日期的查询,如果您感兴趣,下面的问题在这里: