不久前,我写了关于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 行执行子查询(因为,当然,它不再相关,这是顺序的重点让它工作)。
祝你好运!