【问题标题】:Why is this Query not Updateable?为什么此查询不可更新?
【发布时间】:2018-11-17 17:29:02
【问题描述】:

我希望为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   |
+----+--------+--------+--------+

在这里,如果与 Table2 中的 testID 关联的所有 stepID 记录中的 status 具有 @987654330 @ of pass,否则 Table1 应使用 fail 更新为 testID

在这个例子中,结果应该是:

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

我编写了以下 SQL 代码来实现这一点:

update Table1 a inner join 
(
    select 
        b.testID, 
        iif(min(b.status)=max(b.status) and min(b.status)='pass','pass','fail') as v
    from Table2 b 
    group by b.testID
) c on a.testID = c.testID
set a.testStatus = c.v

但是,MS Access 报告了非常熟悉的“操作必须使用可更新查询”响应。

我知道,如果正在更新的记录和值集之间存在一对多关系,则查询是不可更新的,但在这种情况下,聚合子查询将产生一对一的关系两个testID 字段。

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

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    您正在使用聚合 (Max) 加入查询。

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

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

    您还可以通过重写聚合以在EXISTSNOT EXISTS 子句中进行来解决此问题,因为这是WHERE 子句的一部分,因此不需要可更新。这可能对性能的影响最小,但意味着您必须将此查询分成两部分:1 个查询将所有满足您条件的字段设置为“通过”,另一个将它们设置为“失败”(如果不满足)。

    【讨论】:

    • 谢谢埃里克! “查询的每个部分都必须是可更新的”这是我理解的差距。
    • Access 中的更新查询与 SQL Server 和其他 RDBMS 中的非常不同。它们有这个限制(至少在 SELECT 子句中可用的所有内容),但它们确实允许在单个查询中合并和更新多个表,这在许多 RDBMS 中是无法完成的
    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多