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

时间:2016-02-01 08:14:33

标签: sql ms-access join sql-update

我在访问2007中有2个表。 请参见附图,了解表格的结构和预期结果。

enter image description here

我试图通过汇总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;

我收到错误: 操作必须使用可更新的查询。

2 个答案:

答案 0 :(得分:1)

当Access抱怨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(摘要)查询。

我一直在做的是:

  1. TABLE_BLNK的结构复制到临时表:TABLE_BLNK_temp
  2. 在您的代码中,首先删除temp:

    DELETE * FROM TABLE_BLNK_temp;
    
  3. 将摘要查询的结果插入temp:

    INSERT INTO TABLE_BLNK_temp (ITNBR, ITQTY) 
    SELECT LOITNBR, Sum(LOCQTY) AS SumOfLOCQTY 
    FROM TABLE_DTL GROUP BY LOITNBR;
    
  4. 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;
    
  5. 虽然这是额外的一两步,但这种方法:

    • 始终有效

    • 比大型数据集的域聚合函数更具性能