为什么此查询不可更新?

时间:2018-11-17 17:29:03

标签: sql ms-access

我一直在寻找this question的答案,其中OP有两个表:

表1

+--------+--------+
| testID | Status |
+--------+--------+
|      1 |        |
|      2 |        |
|      3 |        |
+--------+--------+

表2

+----+--------+--------+--------+
| 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字段。

哪个让我问,为什么这个查询不能更新?

1 个答案:

答案 0 :(得分:3)

您要加入具有汇总(Max)的查询。

聚合不可更新。在Access中,在更新查询中,查询的每个部分都必须是可更新的(简单表达式和查询的WHERE部分中的子查询除外),这意味着您的查询不可更新。

您可以通过使用域聚合(DMinDMax)而不是真实的聚合来解决此问题,但是如果这样做,此查询将对性能造成很大的影响。

您也可以通过重写要在EXISTSNOT EXISTS子句中进行的汇总来解决此问题,因为这是WHERE子句的一部分,因此不需要更新。这可能会最小程度地影响性能,但是这意味着您必须将此查询分为两部分:1个查询将所有符合条件的字段设置为“通过”,另一个查询将不满足条件的字段设置为“失败”。 >