无法使用简单的内部联接更新表

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 表

我的查询中的内部联接似乎无法识别

带有内部联接和子查询的 Microsoft Access 更新语句

使用spark数据帧/数据集/ RDD使用内部联接进行更新

合并更新 oracle 无法获得一组稳定的行

使用联接的 SQL Server 全文搜索无法按预期工作