2

私はすでに同様の質問をしましたが、テーブル/クエリを単純化して、(できれば) わかりやすい名前を付けてデータベースの例を作成しました。

https://docs.google.com/file/d/0B2PZcGkhNyd4THpWa01fTjVvSWM/edit?usp=sharing

正常に動作する ChainsCasesPerMonthPerStorePreviousMonthRange という 1 つのクエリがあります。2 つのテーブルと QueryDatesPrevious クエリからデータを取得して、前の期間のデータを QueryDates テーブルで指定された期間に戻します。この段階まではすべて問題ないようです。

しかし、クエリ LeftJoinReturnsError を実行すると、Chains テーブル内の 3 つの余分なチェーンが、予想される Null を返す代わりに #Error を返します。

QueryDatesPrevious をクエリからテーブルに変更すると、すべて正常に動作するため、これが問題の原因のようですが、Iif(IsNull, Null, 0) 条件を使用しても解決できないようです。

問題を解決した人には、さらに 50 担当者ポイントが与えられます。:)

(興味がある場合は前の質問: Access 2007 - Left Join to a query returns #Error instead of Null )

-- 編集の更新 --

テストデータベースに入れた正確なデータを覚えていませんが、出力は次のようになります。

Chain                 CasesPerMonthPerStore
AgriStore             2.33
Agricultural Export   
2B Pencils            3.6
Bob's Markets         

したがって、基本的に、他のテーブルにないチェーン テーブル内のチェーンは、左結合の一部として Null を返す必要があります。

4

3 に答える 3

2

これもかなり醜いですが、うまくいくようです:

次のクエリを実行して、[tblChainsCasesPerMonthPerStorePreviousMonthRange] という名前のテーブルを作成します。

SELECT ChainsCasesPerMonthPerStorePreviousMonthRange.* 
INTO tblChainsCasesPerMonthPerStorePreviousMonthRange
FROM ChainsCasesPerMonthPerStorePreviousMonthRange;

[updChainsCasesPerMonthPerStorePreviousMonthRange] という名前のクエリを [ChainsCasesPerMonthPerStorePreviousMonthRange] の結果を [tblChainsCasesPerMonthPerStorePreviousMonthRange] に保存する更新クエリとして作成します。

INSERT INTO tblChainsCasesPerMonthPerStorePreviousMonthRange
SELECT ChainsCasesPerMonthPerStorePreviousMonthRange.*
FROM ChainsCasesPerMonthPerStorePreviousMonthRange;

次の関数を標準の VBA モジュールに貼り付けます

Public Function RemakeTable() As Variant
Dim qdf As DAO.QueryDef
Debug.Print "Executing RemakeTable()..."
CurrentDb.Execute "DELETE FROM tblChainsCasesPerMonthPerStorePreviousMonthRange", dbFailOnError
Set qdf = CurrentDb.QueryDefs("updChainsCasesPerMonthPerStorePreviousMonthRange")
qdf.Execute
Set qdf = Nothing
RemakeTable = Null
End Function

[LeftJoinReturnsError] クエリを次のように更新します。

SELECT 
    Chains.Chain, 
    tblChainsCasesPerMonthPerStorePreviousMonthRange.CasesPerMonthPerStore,
    RemakeTable() AS Junk
FROM 
    Chains 
    LEFT JOIN 
    tblChainsCasesPerMonthPerStorePreviousMonthRange 
        ON Chains.Chain=tblChainsCasesPerMonthPerStorePreviousMonthRange.Chain;

最後のクエリには [Junk] という名前の余分な列がありますが、少なくとも目的の結果が得られます。

注: Debug.PrintVBA 関数に を入れて、クエリの行ごとに 1 回ではなく、1 回だけ呼び出されることを確認しました。

于 2013-06-23T23:37:25.807 に答える
1

バグに関する素晴らしい投稿。私はそれを見たことがありませんでしたが、まさにそれが起こっていることは明らかです. Access はラテラル ジョインや SQL Server の APPLY 句をサポートしていないため、これに対処する唯一の方法は、最上位のクエリで式を select 句に昇格させることです。以下は、必要な出力を提供します。

SELECT Chains.Chain, (SELECT ChainsCasesPerMonthPerStorePreviousMonthRange.CasesShipped/(DateDiff("m",ChainsCasesPerMonthPerStorePreviousMonthRange.StartDatePrevious,ChainsCasesPerMonthPerStorePreviousMonthRange.EndDatePrevious)+1)/ChainsCasesPerMonthPerStorePreviousMonthRange.NumberOfStores AS Expr1 from ChainsCasesPerMonthPerStorePreviousMonthRange WHERE ChainsCasesPerMonthPerStorePreviousMonthRange.Chain = Chains.Chain) as Expr2
FROM Chains;

それはかなり醜いですが、うまくいきます。もちろん、SQL Server または別の DB では、プロセスの外部結合が式と正しく結合されるため、横結合は必要ありません。

于 2013-06-23T17:49:54.513 に答える