Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access Access 2007-查询的左连接返回错误而不是Null_Ms Access_Ms Access 2007_Left Join - Fatal编程技术网

Ms access Access 2007-查询的左连接返回错误而不是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

与此问题类似,但他们的查询问题从未完全解决:

在执行左连接时,如果在连接的右侧没有相应的记录,我希望看到Null,则会出现错误:

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,那么该值确实会出现在每个链上,无论它们是否出现在连接的右侧。对于计算字段,它返回了一个错误。只有当它直接引用单个字段时,它才能正常工作。如果我真的解决了,我会在这里发布解决方法。将其缩小到生成日期的查询,如果您感兴趣,下面的问题在这里: