如何在更新语句中正确使用 Avg 函数?

Posted

技术标签:

【中文标题】如何在更新语句中正确使用 Avg 函数?【英文标题】:How do I correctly use an Avg function in an update statement? 【发布时间】:2011-09-06 19:55:59 【问题描述】:

我正在尝试获取插入表中的每个 MIUID 的平均值。相关表格及栏目信息如下:

表 1.[MIU ID],表 1.[平均 RSSI]

Table2.MIUID,Table2.MeanNum

如果我只是使用 select 语句,我会执行以下操作:

Select DISTINCT Table1.[MIU ID], Avg(Table1.[Avg RSSI]) as MeanNum
From Table1
GROUP BY Table1.[MIU ID]  

但是,我需要将此信息插入到 Table2 的列中。我已经尝试了以下和以下的变体,我得到的错误是它不允许我使用 Group By,另一个错误是 MeanNum 不是聚合函数的一部分。

UPDATE Table2  
INNER JOIN Table1
ON Table2.MIUID = Table1.[MIU ID]  
SET Table2.MeanNum = Avg([Table1].[Avg RSSI]);

我尝试过的另一个查询是:

UPDATE Table2  
SET Table2.MeanNum = Avg([Table1].[Avg RSSI]) 
WHERE Table2.MIUID = Table1.[MIU ID]
Group By [Table1].[Avg RSSI]

总结 重申一下,我要做的就是获取 Table1 中每个不同 MIU ID 的 Avg RSSI 列的平均值,并将每个值插入到 Table2 中的相应行中。

注意 表 2 中有一个名为 AvgNum 的列,如果使用它会更容易,可以取平均值以获得需要进入 MeanNum 列的相同数字。

我知道如何分两步做我想做的事,但我希望能够在一个 sql 语句中完成。

【问题讨论】:

根据定义,关系表没有重复行。 SQL 查询的结果可以包含重复的行(默认为SELECT ALL,而可以说它应该是SELECT DISTINCT)。因此,为了在 SQL 中实施关系理论,我们鼓励人们始终使用SELECT DISTINCT 而不是SELECT [ALL]UNION 而不是UNION ALL,并避免任何可能产生空值的东西。 p.s.如果 GROUP BY 返回空集,是否可以说具有“唯一行”? ;) 【参考方案1】:

编辑:下面的代码在 MS-Access/Jet 中不起作用。请参阅此链接:

Operation must use an updatable query. (Error 3073) Microsoft Access

原答案:

您可以在子查询中使用原始的 SELECT 查询并加入它。没有检查语法,我比 MS-Access 更熟悉 T-SQL,但类似:

UPDATE 
    t2
SET 
    t2.MeanNum = sub.MeanNum
From 
    Table2 t2
    INNER JOIN 
        (
        Select DISTINCT 
            Table1.[MIU ID], 
            Avg(Table1.[Avg RSSI] as MeanNum
        From 
            Table1  
        GROUP BY 
            Table1.[MIU ID] 
        ) sub
        ON sub.[MIU ID] = t2.MIUID 

【讨论】:

似乎无法让它发挥作用,即使尝试了多种变体。我收到错误“操作必须使用可更新查询”,就像我对 PaulStock 的查询所做的一样。 呃。好像和Access/Jet有关:***.com/questions/170578/… 非常有用的链接谢谢。尽管在 Access 中缺少对更新语句的支持是非常可悲的,但这回答了我的问题,我将求助于使用临时表的标准后备计划。您能否用您的评论更新您的答案,以便我可以接受它作为答案,并且人们不会认为该查询在 Access 中可以解决所述问题? 是的,这令人沮丧。更新。 :)

以上是关于如何在更新语句中正确使用 Avg 函数?的主要内容,如果未能解决你的问题,请参考以下文章

已声明且未使用 - 如何更新 IF 语句中的变量

如何在postgres中查询最近更新日期的同类别AVG值?

SQL AVG() 函数在多列时返回 INT

如何在 SQLDataAdapter 中使用更新语句

如何在 RODBC 中运行 SQL 更新语句?

如何使用函数调用正确更新 CGContext?