访问更新查询:查询不包含指定表达式作为聚合函数的一部分

Posted

技术标签:

【中文标题】访问更新查询:查询不包含指定表达式作为聚合函数的一部分【英文标题】:Access Update Query: Query does not include the specified expression as part of an aggregate function 【发布时间】:2018-10-19 06:58:39 【问题描述】:

我正在尝试执行以下操作: 1. 将 Ride 表中每个司机取消的计数 (IsCancelled = "Y") 放入 Driver 表中,以跟踪每个司机取消了多少次。 2. 将每个司机的平均评分输入到 Driver 表中 - 这是从 Ride 表中该特定司机的所有 DriverRating 的平均值得出的。

UPDATE Driver 

INNER JOIN ((Car 
INNER JOIN CarTypeAssignment ON Car.LicensePlateNo = CarTypeAssignment.LicensePlateNo) 
INNER JOIN Ride ON CarTypeAssignment.CarTypeAssignmentID = Ride.CarTypeAssignmentID) 

ON Driver.DriverLicenseNo = Car.DriverLicenseNo 

SET Driver.DriverCancellation = Count([Ride].[IsCancelled]), Driver.DriverRating = Avg([Ride].[DriverRating]);

我尝试在 Microsoft Access 中执行上述 SQL 代码,但收到以下错误消息:

您的查询不包含作为聚合函数的一部分的指定表达式“Driver Cancellation”。

*附注我无法附上我的表格的图片,所以请忽略代码的 INNER JOIN 部分 - 它应该是正确的。

【问题讨论】:

保存计算数据通常是不必要的,而且可能很危险,尤其是聚合数据。保存的数据可能与原始数据“不同步”。如果您可以计算 UPDATE 的值,则可以在需要时进行计算。 Access 甚至不允许在聚合 (GROUP BY) 查询中使用聚合函数(Sum、Count 等)的 UPDATE 操作 SQL。 【参考方案1】:

UPDATE 不支持聚合。您需要使用子查询。

UPDATE Driver d INNER JOIN
       (SELECT DriverLicenseNo, 
               Count([Ride].IsCancelled) as cnt,
               Avg([Ride].[DriverRating]) as avg_rating
        FROM (Car as c INNER JOIN
              CarTypeAssignment as cta
              ON c.LicensePlateNo = cta.LicensePlateNo
             ) INNER JOIN
             Ride as r
             ON cta.CarTypeAssignmentID = r.CarTypeAssignmentID
       ) as c 
       ON d.DriverLicenseNo = c.DriverLicenseNo 
    SET d.DriverCancellation = cnt,
        d.DriverRating = avg_rating;

【讨论】:

以上是关于访问更新查询:查询不包含指定表达式作为聚合函数的一部分的主要内容,如果未能解决你的问题,请参考以下文章

我得到:“您尝试执行的查询不包含指定表达式'OrdID'作为聚合函数的一部分。我该如何绕过?

尝试执行不包含指定表达式“StaffDetails.StaffID”的查询作为聚合函数的一部分

您的查询不包含表达式“未结金额”作为聚合函数的一部分 - MS Access

UNION 查询错误 - “您已尝试执行不包含指定表达式的查询...”

无法对包含 MySql 中的聚合或子查询的表达式执行聚合函数

SQL Server“不能对包含聚合或子查询的表达式执行聚合函数”,但 Sybase 可以