2

この質問に似ていますが、クエリに関する問題は完全には解決されませんでした:

#複数の LEFT JOIN ステートメントで表示されるエラー 値が NULL である必要があるアクセス クエリ

結合の右側に対応するレコードがない左結合を行うときに、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 を返すのは、Left Joining 時の動作だけです。

nb 途中の奇妙な Iif ステートメントは、最初の注文からの月数が、指定された日付範囲に含まれる月数よりも大きいかどうかを確認します。つまり、日付範囲が 6 か月で、最初の注文が 9 か月前だった場合終了日。6 を使用します。最初の注文が終了日のわずか 4 か月前の場合、4 が使用されます。

-- 編集の更新 --

そうです、クエリの要素を 1 つずつ取り出しました。これは、左側の結合エラーを再現しながら取得できる最も単純なものです。

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 に何か問題がありますか?

4

3 に答える 3

4

クエリは結合タイプに基づいて Null を返す必要がありますが、Allen Browne が彼の記事で述べているように、バグ: 外部結合式が間違って取得されました。

「代わりに、[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;
于 2014-03-13T18:24:19.337 に答える
1

Access の既知のバグに関係しているように見えます。これにより、計算フィールドを使用した外部結合でエラーが発生します。

http://allenbrowne.com/BugOuterJoinExpression.html

http://allenbrowne.com/bug-10.html

サブクエリを再調整して、計算フィールドを何らかの方法で偽装できるかどうかを確認します。

アクセスが大好きです。:)

于 2013-06-19T13:24:19.987 に答える