1

首先,我知道已经有关于它的问题和答案,这个线程是最接近我需要的线程:

SQL 更新其连接值的总和

但是,我收到了似乎在FROM子句附近发生的语法错误(缺少运算符)。然而我看不到。它不喜欢FROM自己吗?我不习惯FROM在更新语句中使用,但从我刚刚链接的 QA 看来它是有效的:|

知道为什么会有语法错误吗?

我正在使用 Access 2007 SP3。

编辑:哇,我忘了发布查询...

UPDATE r

SET
    r.tempsmoy_requete_min = tmm.moy_mob_requete

FROM
    rapports AS r INNER JOIN
    (SELECT 
        id_fichier, 
        Round(Sum(temps_requete_min)/3,0) As moy_mob_requete,
        Round(Sum(temps_analyse_min)/3,0) As moy_mob_analyse, 
        Round(Sum(temps_maj_min)/3,0) As moy_mob_maj, 
        Round(Sum(temps_rap_min)/3,0) As moy_mob_rap, 
        Round(Sum(temps_ddc_min)/3,0) As moy_mob_ddc

    FROM maintenances 

    WHERE 
        periode In (10,9,8) And 
        annee=2011

    GROUP BY id_fichier) AS tmm ON rapports.id_rapport = tmm.id_fichier

WHERE 
    1=0

WHERE 1=0部分是因为我想在运行它之前进一步测试子查询。

编辑:这是我正在尝试的一些更简单的查询。这次我得到一个不同的错误。它现在告诉我 tempsmoy_requete_min (可能还有所有其他左操作数)不是聚合函数的一部分......这是我查询的重点。任何的想法 ?

UPDATE 
    rapports INNER JOIN maintenances ON rapports.id_rapport = maintenances.id_fichier

SET
    rapports.tempsmoy_requete_min = Round(Sum(temps_requete_min)/3,0),
    rapports.tempsmoy_analyse_min = Round(Sum(temps_analyse_min)/3,0),
    rapports.tempsmoy_maj_min = Round(Sum(temps_maj_min)/3,0),
    rapports.tempsmoy_rap_min = Round(Sum(temps_rap_min)/3,0),
    rapports.tempsmoy_ddc_min = Round(Sum(temps_ddc_min)/3,0)

WHERE 
    maintenances.periode In (10,9,8) And 
    maintenances.annee=2011 AND
    1=0

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

0
UPDATE r

应该

UPDATE rapports

您不能在更新目标中可靠地使用别名。

于 2012-09-07T13:36:15.060 回答
0

我尝试调整您的第一个查询示例,并且能够使您的错误消失。但是后来我遇到了一个不同的错误('操作必须使用可更新的查询')。

也有可能克服这个错误。但是,我发现使用域函数而不是连接来检索替换值更容易。

UPDATE rapports
SET tempsmoy_requete_min = Round(DSum("temps_requete_min",
    "maintenances",
    "periode In (10,9,8) AND annee=2011 "
    & "AND id_fichier='" & id_rapport
    & "'")/3, 0);

如果此建议适用于tempsmoy_requete_min您的数据,则必须将其扩展到您要替换的其他字段。那不会很漂亮。您可以使用保存的查询使其不那么难看,然后将其用作...的“”参数,DSum()这可以让您使用更简单的“标准”参数。

于 2012-09-07T16:00:53.563 回答