我之前写过一篇关于Access/JET SQL相关的相关子查询限制的文章,并记录了SQL UPDATE连接多个表的语法。根据那些信息和一些快速测试,我认为在Access/JET中没有任何方法可以使用单个SQL UPDATE语句实现你想要的操作。如果可以的话,该语句将类似于:
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行执行(因为它不再相关,这是整个过程的关键点)。祝好运!