在UPDATE查询中使用SELECT

mam*_*ius 13 sql ms-access-2007 sql-update

如何在Microsoft Access 2007 UPDATE中使用SELECT查询结果的表的字段.

这是选择查询:

SELECT Min(TAX.Tax_Code) AS MinOfTax_Code
FROM TAX, FUNCTIONS

WHERE (((FUNCTIONS.Func_Pure)<=[Tax_ToPrice]) AND ((FUNCTIONS.Func_Year)=[Tax_Year]))

GROUP BY FUNCTIONS.Func_ID;
Run Code Online (Sandbox Code Playgroud)

这是更新查询:

UPDATE FUNCTIONS

 SET FUNCTIONS.Func_TaxRef = [Result of Select query]
Run Code Online (Sandbox Code Playgroud)

And*_*mar 19

好吧,看起来Access无法在UPDATE查询中进行聚合.但它可以在SELECT查询中进行聚合.因此,创建一个定义如下的查询:

SELECT func_id, min(tax_code) as MinOfTax_Code
FROM Functions
INNER JOIN Tax 
ON (Functions.Func_Year = Tax.Tax_Year) 
AND (Functions.Func_Pure <= Tax.Tax_ToPrice) 
GROUP BY Func_Id
Run Code Online (Sandbox Code Playgroud)

并将其保存为YourQuery.现在我们必须解决另一个访问限制.UPDATE查询无法对查询进行操作,但它们可以在多个表上运行.因此,让我们将查询转换为带有Make Table查询的表:

SELECT YourQuery.* 
INTO MinOfTax_Code
FROM YourQuery
Run Code Online (Sandbox Code Playgroud)

这将视图的内容存储在名为MinOfTax_Code的表中.现在您可以执行UPDATE查询:

UPDATE MinOfTax_Code 
INNER JOIN Functions ON MinOfTax_Code.func_id = Functions.Func_ID 
SET Functions.Func_TaxRef = [MinOfTax_Code].[MinOfTax_Code]
Run Code Online (Sandbox Code Playgroud)

在Access中执行SQL有点牵强,我会为您的项目研究Sql Server Express Edition!


ewb*_*wbi 6

我曾经在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
Run Code Online (Sandbox Code Playgroud)

或者,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
Run Code Online (Sandbox Code Playgroud)

但是,这仍然不起作用.

我相信你做这项工作的唯一方法是移动带外最小Tax_Code值的选择和聚合.您可以使用VBA功能执行此操作,或使用Access DLookup功能更轻松地执行此操作.将上面的GROUP BY子查询保存到名为FUNCTIONS_TAX的单独查询中,并将UPDATE语句重写为:

UPDATE FUNCTIONS
SET Func_TaxRef = DLookup(
  "MinOfTax_Code", 
  "FUNCTIONS_TAX", 
  "Func_ID = '" & Func_ID & "'"
)
Run Code Online (Sandbox Code Playgroud)

请注意,DLookup函数可防止此查询在Access之外使用,例如通过JET OLEDB.此外,这种方法的性能可能非常糟糕,具体取决于您要定位的行数,因为正在为每个FUNCTIONS行执行子查询(因为,当然,它不再相关,这是整个点的顺序它的工作).

祝好运!