带有计算字段的连接表的SQL更新

时间:2012-09-07 13:25:37

标签: sql ms-access-2007

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

SQL Update to the SUM of its joined values

但是,我得到一个似乎发生在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

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

UPDATE r

应该是

UPDATE rapports

您无法在更新目标中可靠地使用别名。

答案 1 :(得分: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()的“”参数...这可以让您使用更简单的“条件< / em>“参数。