无法使用简单的内部联接更新表
Posted
技术标签:
【中文标题】无法使用简单的内部联接更新表【英文标题】:Cannot update a table using a simple inner join 【发布时间】:2016-02-01 08:14:33 【问题描述】:我在 access 2007 中有 2 个表。 请参阅附图以查看表格的结构和预期结果。
我正在尝试通过汇总 TABLE_DTL 中相同项目 (LOITNBR=ITNBR) 的所有数量字段 (LOCQTY) 来更新 TABLE_BLNC 中的数量字段 (ITQTY)。 在 TABLE_BLNC 中,item 是唯一的,而在 TABLE_DTL 中,item 可以在多个记录中。
我的查询是:
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;
我收到错误: 操作必须使用可更新的查询。
【问题讨论】:
那么,用文字(不是 SQL)来说,你想做什么? 在 T-SQL(Access、SQL 服务器等)中使用连接的更新语法错误 - 尝试查看这个答案,看看它是否有帮助 ***.com/questions/1293330/… 我会试试UPDATE TABLE_BLNC SET ITQTY = (select sum(.... WHERE ... TABLE_BLNC.ITNBR=DTL.LOITNBR...
UPDATE TABLE_BLNC SET ITQTY= (SELECT Sum(LOCQTY) AS SumOfLOCQTY FROM TABLE_DTL GROUP BY TABLE_DTL.LOITNBR WHERE TABLE_BLNC.ITNBR = TABLE_DTL.LOITNBR);是你的意思吗?我收到语法错误
必须ITQTY
是表中存在的字段吗?您可以在需要时使用这样的SELECT
查询简单地推导出它吗? SELECT TABLE_BLNC.ITNBR, Nz(sub.SumOfLOCQTY, 0) AS [ITQTY] FROM TABLE_BLNC LEFT JOIN (SELECT LOITNBR, Sum(LOCQTY) AS SumOfLOCQTY FROM TABLE_DTL GROUP BY LOITNBR) AS sub ON TABLE_BLNC.ITNBR=sub.LOITNBR;
【参考方案1】:
Domain Aggregate 函数在 Access 抱怨 UPDATE
不可更新时很有用。在这种情况下,请使用DSum() ...
UPDATE TABLE_BLNC
SET ITQTY =
DSum("LOCQTY", "TABLE_DTL", "LOITNBR='" & ITNBR & "'");
索引TABLE_DTL.LOITNBR
以获得最佳性能。
【讨论】:
这是迄今为止唯一可行的建议,但我犹豫是否赞同它,因为域聚合函数在大型数据集上表现不佳。 我认为“最佳”在这里夸大了好处。虽然索引可能会提高域聚合函数的性能,但它的效率仍然低于摘要查询。也许说“更好”?【参考方案2】:Access SQL 最大的烦恼之一是它无法从不可更新的源更新表。不可更新的源包括 ODBC 表的只读链接和 GROUP BY(摘要)查询。
我经常做的是:
-
将
TABLE_BLNK
的结构复制到一个临时表:TABLE_BLNK_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_temp
更新TABLE_BLNK
:
UPDATE TABLE_BLNC INNER JOIN TABLE_BLNK_temp AS t
ON TABLE_BLNC.ITNBR = t.ITNBR
SET TABLE_BLNC.ITQTY = t.ITQTY;
虽然这是一个或两个额外的步骤,但这种方法:
始终有效
对于更大的数据集,比域聚合函数的性能更高
【讨论】:
以上是关于无法使用简单的内部联接更新表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表