以前、Access/JET SQLの相関サブクエリのいくつかの制限について書き、SQL UPDATE で複数のテーブルを結合するための構文に注目しました。その情報といくつかの簡単なテストに基づいて、単一の SQL UPDATE ステートメントで Access/JET を使用してやりたいことを行う方法はないと思います。可能であれば、ステートメントは次のようになります。
UPDATE FUNCTIONS A
INNER JOIN (
SELECT AA.Func_ID, Min(BB.Tax_Code) AS MinOfTax_Code
FROM TAX BB, FUNCTIONS AA
WHERE AA.Func_Pure<=BB.Tax_ToPrice AND AA.Func_Year= BB.Tax_Year
GROUP BY AA.Func_ID
) B
ON B.Func_ID = A.Func_ID
SET A.Func_TaxRef = B.MinOfTax_Code
別の方法として、Access/JET では、サブクエリを別のクエリとして保存し、それをより伝統的な方法で UPDATE ステートメントに結合することができる場合があります。したがって、たとえば、上記の SELECT サブクエリを FUNCTIONS_TAX という名前の別のクエリとして保存した場合、UPDATE ステートメントは次のようになります。
UPDATE FUNCTIONS
INNER JOIN FUNCTIONS_TAX
ON FUNCTIONS.Func_ID = FUNCTIONS_TAX.Func_ID
SET FUNCTIONS.Func_TaxRef = FUNCTIONS_TAX.MinOfTax_Code
ただし、これはまだ機能しません。
これを機能させる唯一の方法は、最小の Tax_Code 値の選択と集計を帯域外に移動することだと思います。これは、VBA 関数を使用して行うことも、Access DLookup 関数を使用してより簡単に行うこともできます。上記の GROUP BY サブクエリを FUNCTIONS_TAX という名前の別のクエリに保存し、UPDATE ステートメントを次のように書き直します。
UPDATE FUNCTIONS
SET Func_TaxRef = DLookup(
"MinOfTax_Code",
"FUNCTIONS_TAX",
"Func_ID = '" & Func_ID & "'"
)
DLookup 関数は、このクエリが Access の外部 (JET OLEDB 経由など) で使用されるのを防ぐことに注意してください。また、サブクエリが FUNCTIONS 行ごとに実行されるため、このアプローチのパフォーマンスは、対象とする行の数によってはかなりひどいものになる可能性があります (もちろん、相関関係がなくなったためです。これが順序の全体的なポイントです)。それが機能するために)。
幸運を!