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;
答案 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的真正原因之一。