我一直在寻找this question的答案,其中OP有两个表:
+--------+--------+
| testID | Status |
+--------+--------+
| 1 | |
| 2 | |
| 3 | |
+--------+--------+
+----+--------+--------+--------+
| ID | testID | stepID | status |
+----+--------+--------+--------+
| 1 | 1 | 1 | pass |
| 2 | 1 | 2 | fail |
| 3 | 1 | 3 | pass |
| 4 | 2 | 1 | pass |
| 5 | 2 | 2 | pass |
| 6 | 3 | 1 | fail |
+----+--------+--------+--------+
在此,如果所有status
记录中的testID
与{1}表2中的pass
的{{1}}是status
,否则表1应该用stepID
来更新testID
。
在此示例中,结果应为:
status
为了达到这一目的,我编写了以下SQL代码:
pass
但是,MS Access会报告非常熟悉的“操作必须使用可更新的查询”响应。
我知道,如果要更新的记录与值集之间存在一对多的关系,那么查询是不可更新的,但是在这种情况下,聚合子查询将在两个记录之间产生一对一的关系。两个fail
字段。
哪个让我问,为什么这个查询不能更新?
答案 0 :(得分:3)
您要加入具有汇总(Max
)的查询。
聚合不可更新。在Access中,在更新查询中,查询的每个部分都必须是可更新的(简单表达式和查询的WHERE
部分中的子查询除外),这意味着您的查询不可更新。
您可以通过使用域聚合(DMin
和DMax
)而不是真实的聚合来解决此问题,但是如果这样做,此查询将对性能造成很大的影响。
您也可以通过重写要在EXISTS
或NOT EXISTS
子句中进行的汇总来解决此问题,因为这是WHERE
子句的一部分,因此不需要更新。这可能会最小程度地影响性能,但是这意味着您必须将此查询分为两部分:1个查询将所有符合条件的字段设置为“通过”,另一个查询将不满足条件的字段设置为“失败”。 >