如何使这个复杂的更新查询工作?

时间:2009-06-23 19:08:44

标签: sql ms-access

SELECT
    (SELECT 
        IIF(IsNull(sum(b.AmountCharged) - sum(b.AmountPaid)),
                a.Balance, 
                (sum(b.AmountCharged) - sum(b.AmountPaid)))
        FROM tblCurrentTransaction AS b
        WHERE b.TenantTransactionID <= a.TenantTransactionID 
                AND b.Tenant = a.Tenant
        GROUP BY b.Tenant
    ) AS TrueBalance, a.TenantTransactionID
    FROM tblCurrentTransaction AS a
    ORDER BY a.Tenant, a.TenantTransactionID;
UNION
UPDATE tblCurrentTransaction SET tblCurrentTransaction.Balance = TrueBalance
WHERE tblCurrentTransaction.TenantTransactionID = a.TenantTransactionID;

基本上发生的是我从第一个查询得到一个结果集,然后我将它的TenantTransactionID与更新查询相匹配。但是Access抱怨:“操作查询不能用作行源”

我该如何解决这个问题?

这是没有UNION的查询

UPDATE tblCurrentTransaction SET tblCurrentTransaction.Balance = (SELECT
    (SELECT 
        IIF(IsNull(sum(b.AmountCharged) - sum(b.AmountPaid)),
                a.Balance, 
                (sum(b.AmountCharged) - sum(b.AmountPaid)))
        FROM tblCurrentTransaction AS b
        WHERE b.TenantTransactionID <= a.TenantTransactionID 
                AND b.Tenant = a.Tenant
        GROUP BY b.Tenant
    ) AS TrueBalance
    FROM tblCurrentTransaction AS a
    WHERE a.TenantTransactionID = tblCurrentTransaction.TenantTransactionID
    ORDER BY a.Tenant, a.TenantTransactionID;
);

但它没有做任何事情,Access抱怨“操作必须使用可更新的查询”

这是收集数据的查询 此查询返回真实余额及其所属的事务ID。这就是我需要插入到表中的内容。

SELECT (SELECT IIF(IsNull(sum(b.AmountCharged) - sum(b.AmountPaid)),a.Balance, (sum(b.AmountCharged) - sum(b.AmountPaid)))
          FROM tblCurrentTransaction AS b
          WHERE b.TenantTransactionID <= a.TenantTransactionID AND b.Tenant = a.Tenant
          GROUP BY b.Tenant
        ) AS TrueBalance, a.TenantTransactionID
FROM tblCurrentTransaction AS a
ORDER BY a.Tenant, a.TenantTransactionID;

5 个答案:

答案 0 :(得分:2)

SELECT UNION UPDATE。哇。从来没有见过任何人尝试过那个。

如果这真的必须在SQL中完成,我会说整个事情用子查询重写为UPDATE

如果不是真的必须在SQL中完成,我会说重写整个过程,所以逻辑是你的应用程序语言,SQL查询很简单UPDATE

编辑:OP和我经历了一些冒险,正如你在评论中看到的那样。最后的解决方案是使用临时表进行计算,并将结果从那里推回到tblCurrentTransaction。我责怪Access。

答案 1 :(得分:1)

试试这个:

UPDATE tblCurrentTransaction SET tblCurrentTransaction.Balance = i.TrueBalance
FROM ((SELECT 
    IIF(IsNull(sum(b.AmountCharged) - sum(b.AmountPaid)), a.Balance, (sum(b.AmountCharged) - sum(b.AmountPaid)))
    FROM tblCurrentTransaction AS b
    WHERE b.TenantTransactionID <= a.TenantTransactionID AND b.Tenant = a.Tenant
    GROUP BY b.Tenant
  ) AS TrueBalance, a.TenantTransactionID
  FROM tblCurrentTransaction AS a
 )AS i
WHERE tblCurrentTransaction.TenantTransactionID = i.TenantTransactionID;

答案 2 :(得分:0)

您需要重新排序查询,因此您正在执行UPDATE ... WHERE(条件)IN(SELECT ...)。基本上,使用SELECT作为子选择来为IN提供结果集。

答案 3 :(得分:0)

我最近有类似的经历。我需要更新连接并发现Access不会处理类似的复杂更新查询。我怀疑这种情况属于那种情况,但这确实很难建立,因为Access文档对于它将会做什么和不会做什么都不是那么明确。我最终将工作转移到SQL Server。

总的来说,我同意CHAOS的观点,你应该通过app逻辑包围它来简化查询。

答案 4 :(得分:0)

请参阅MSDN:

ACC: Update Query Based on Totals Query Fails

[报价] 当您运行更新查询时,您会收到以下错误消息:

操作必须使用可更新的查询。

当查询的“更新到”行中的值是...包含聚合(总计)函数的选择查询或子查询中的字段时,会出现此错误消息...

此行为是设计限制。 [引文结束]

[我听说有人因为放弃Access数据库引擎而向下投票。哦,好吧,我想我只需要把我的声誉放在线上......]

Access数据库引擎有许多“设计限制”,但对我来说,它的非标准(ISO / ANSI SQL标准,即),模糊和严格限制的UPDATE语法是它最糟糕的特性。我没有接受任何变通办法,这也是我多年前将所有严肃项目都移到SQL Server的真正原因之一。