14

如何在 Microsoft Access 2007UPDATE中使用查询结果来获取表的字段。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;

这是更新查询:

UPDATE FUNCTIONS

 SET FUNCTIONS.Func_TaxRef = [Result of Select query]
4

6 回答 6

20

好吧,看起来 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

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

SELECT YourQuery.* 
INTO MinOfTax_Code
FROM YourQuery

这将视图的内容存储在名为 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]

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

于 2009-05-16T10:16:37.293 回答
7

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

祝你好运!

于 2009-05-16T09:46:16.913 回答
1

我有一个类似的问题。我想在一列中找到一个字符串,然后将该值放在同一张表的另一列中。下面的 select 语句查找括号内的文本。

当我在 Access 中创建查询时,我选择了所有字段。在该查询的 SQL 视图中,我将 mytable.myfield 替换为我想要从括号内获取值的字段

SELECT Left(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")), 
            Len(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")))-1) 

我运行了一个生成表查询。生成表查询具有上述替换的所有字段,并以INTO NameofNewTable FROM mytable

于 2011-07-29T21:08:09.523 回答
0

这行得通吗?未经测试,但应该明白这一点。

UPDATE FUNCTIONS
SET Func_TaxRef = 
(
  SELECT Min(TAX.Tax_Code) AS MinOfTax_Code
  FROM TAX, FUNCTIONS F1
  WHERE F1.Func_Pure <= [Tax_ToPrice]
    AND F1.Func_Year=[Tax_Year]
    AND F1.Func_ID = FUNCTIONS.Func_ID
  GROUP BY F1.Func_ID;
)

基本上,对于 FUNCTIONS 中的每一行,子查询确定最小的当前税码并将 FUNCTIONS.Func_TaxRef 设置为该值。这是假设 FUNCTIONS.Func_ID 是主键或唯一键。

于 2009-05-16T07:50:32.777 回答
0

我确实想再添加一个使用 VBA 函数的答案,但它确实可以在一个 SQL 语句中完成工作。虽然,它可能很慢。

UPDATE FUNCTIONS
SET FUNCTIONS.Func_TaxRef = DLookUp("MinOfTax_Code", "SELECT
FUNCTIONS.Func_ID,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;", "FUNCTIONS.Func_ID=" & Func_ID)
于 2013-07-03T22:16:21.297 回答
0

我知道这个话题很老,但我想我可以添加一些东西。

我无法在 MS Access 2010 中使用 SQL 进行选择查询更新。我使用了 Tomalak 的建议来完成这项工作。我有一个截图,但显然这个网站上的新手太多了,无法发布它。

我可以使用查询设计工具来做到这一点,但即使我正在查看一个确认成功的更新查询,Access 也无法向我展示实现它的 SQL。所以我不能单独使用 SQL 代码来完成这项工作。

我创建了我的选择查询并将其保存为单独的查询。在查询设计工具中,我添加了我正在尝试更新我保存的选择查询的表(我将唯一键放在选择查询中,因此它们之间有一个链接)。正如 Tomalak 所建议的,我将查询类型更改为更新。然后我只需要选择我试图更新的字段(并指定表)。在“更新至”字段中,我输入了来自我带来的选择查询的字段名称。

此格式成功并更新了原始表。

于 2014-03-17T17:13:19.660 回答