如何UPDATE
一个表的字段,其中包含Microsoft Access 2007中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]
答案 0 :(得分:18)
好吧,看起来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!
答案 1 :(得分:6)
我在前一段时间写过Access / JET SQL中的一些limitations of correlated subqueries,并注意到为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行执行子查询(因为,当然,它不再相关,这是整个点的顺序为了它的工作)。
祝你好运!答案 2 :(得分:1)
我有类似的问题。我想在一列中找到一个字符串,并将该值放在同一个表中的另一列中。下面的select语句查找了parens中的文本。
当我在Access中创建查询时,我选择了所有字段。在该查询的SQL视图中,我将mytable.myfield替换为我希望从parens中获取值的字段
SELECT Left(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")),
Len(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")))-1)
我运行了一个make table查询。 make表查询包含具有上述替换的所有字段,并以INTO NameofNewTable FROM mytable
答案 3 :(得分: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是主键或唯一键。
答案 4 :(得分: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)
答案 5 :(得分:0)
我知道这个话题很老,但我想我可以添加一些内容。
我无法在MS Access 2010中使用SQL进行选择查询工作的更新。我使用了Tomalak的建议来完成这项工作。我有一个屏幕截图,但显然这个网站上有一个新手可以发布它。
我能够使用查询设计工具执行此操作,但即使我正在查看已确认的成功更新查询,Access也无法向我显示使其成为可能的SQL。所以我无法单独使用SQL代码。
我创建并将我的选择查询保存为单独的查询。在查询设计工具中,我添加了表,我正在尝试更新我保存的选择查询(我将唯一键放在选择查询中,因此它们之间有链接)。就像Tomalak建议的那样,我将查询类型更改为更新。然后我只需要选择我想要更新的字段(并指定表格)。在“更新到”字段中,我输入了我带来的选择查询中字段的名称。
此格式成功并更新了原始表格。