我在访问2007中有2个表。 请参见附图,了解表格的结构和预期结果。
我试图通过汇总TABLE_DTL中相同项目(LOITNBR = ITNBR)的所有数量字段(LOCQTY)来更新TABLE_BLNC中的数量字段(ITQTY)。 在TABLE_BLNC中,该项是唯一的,而在TABLE_DTL中,该项可以在多个记录中。
我的查询是:
UPDATE TABLE_BLNC INNER JOIN
(
SELECT LOITNBR, Sum(LOCQTY) AS SumOfLOCQTY FROM TABLE_DTL GROUP BY LOITNBR) AS DTL
ON TABLE_BLNC.ITNBR=DTL.LOITNBR SET TABLE_BLNC.ITQTY = DTL.SumOfLOCQTY;
我收到错误: 操作必须使用可更新的查询。
答案 0 :(得分:1)
UPDATE
不可更新时,Domain Aggregate函数会很有用。在这种情况下,请使用DSum() ...
UPDATE TABLE_BLNC
SET ITQTY =
DSum("LOCQTY", "TABLE_DTL", "LOITNBR='" & ITNBR & "'");
索引TABLE_DTL.LOITNBR
以获得最佳效果。
答案 1 :(得分:1)
Access SQL的一大烦恼是它无法从不可更新的源更新表。不可更新的源包括ODBC表的只读链接和GROUP BY(摘要)查询。
我一直在做的是:
TABLE_BLNK
的结构复制到临时表:TABLE_BLNK_temp
。在您的代码中,首先删除temp:
DELETE * FROM TABLE_BLNK_temp;
将摘要查询的结果插入temp:
INSERT INTO TABLE_BLNK_temp (ITNBR, ITQTY)
SELECT LOITNBR, Sum(LOCQTY) AS SumOfLOCQTY
FROM TABLE_DTL GROUP BY LOITNBR;
从TABLE_BLNK
更新TABLE_BLNK_temp
:
UPDATE TABLE_BLNC INNER JOIN TABLE_BLNK_temp AS t
ON TABLE_BLNC.ITNBR = t.ITNBR
SET TABLE_BLNC.ITQTY = t.ITQTY;
虽然这是额外的一两步,但这种方法:
始终有效
比大型数据集的域聚合函数更具性能