选择的字段不包含在 GROUP BY 子句中,那么这个 Access 查询如何成功运行?

Posted

技术标签:

【中文标题】选择的字段不包含在 GROUP BY 子句中,那么这个 Access 查询如何成功运行?【英文标题】:Selected field is not included in GROUP BY clause, so how does this Access query run successfully? 【发布时间】:2017-12-10 00:59:19 【问题描述】:

我在别人建立的 MS Access 数据库中找到了这个查询:

SELECT
      tblWorkOrder.WorkOrderNum
    , tblWorkOrder.SprayTypes
    , tblWorkOrder.Description
    , tblWorkOrderMaterials.ChemicalName
    , tblWorkOrderMaterials.RatePerAcre
    , tblMaterials.ApplicationUnit
    , tblMaterials.DryOrLiquid
    , tblWorkOrderMaterials.ID
FROM (tblMaterials
INNER JOIN tblMaterialsDetails ON tblMaterials.ChemicalName = tblMaterialsDetails.ChemicalName)
INNER JOIN (tblWorkOrder
INNER JOIN tblWorkOrderMaterials ON tblWorkOrder.WorkOrderNum = tblWorkOrderMaterials.WorkOrderNum) ON tblMaterials.ChemicalName = tblWorkOrderMaterials.ChemicalName
WHERE (((tblMaterialsDetails.CropType) = "Apples"
OR (tblMaterialsDetails.CropType) = "All"))
GROUP BY
      tblWorkOrder.WorkOrderNum
    , tblWorkOrder.Description
    , tblWorkOrderMaterials.ChemicalName
    , tblWorkOrderMaterials.RatePerAcre
    , tblMaterials.ApplicationUnit
    , tblMaterials.DryOrLiquid
    , tblWorkOrderMaterials.ID;

查询在 Access 中运行良好,这就是问题所在。当字段“tblWorkOrder.SprayTypes”包含在SELECT 列表中但不包含在GROUP BY 子句中时,此查询如何运行?它应该基于未包含在聚合函数中的字段而导致错误,对吧?当我将后端迁移到 mysql 时,它像我预期的那样坏了,所以我想确保我在 Access 后端版本中没有遗漏任何东西。

这里是tblWorkOrder和tblSprayTypes的关系:

【问题讨论】:

不是我期望 Access 会这样做,但如果这些列“在功能上依赖于”在该子句中指定的某个其他列,则可以省略 group by 子句中的列。也许 Access 有一些关于 tblWorkOrder.SprayTypes 的元数据,而 MySQL 没有。该列是枚举吗? 看起来 tblWorkOrder.SprayTypes 是一个文本字段,但在 Access 数据库中,它从单独的 SprayTypes 表中查找其值。 那么我相信这就是你的答案,如果它“只是一个文本列”,那么它需要在 group by 子句中,如果“功能依赖”由组中的其他列确定到那时它可以被省略。这就是为什么实际上在 group by 子句中包含所有非聚合列总是更容易的原因。 SprayTables的数据类型是calculated field吗? @Parfait 它没有计算出来。 【参考方案1】:

它运行成功,因为 select 子句中没有任何需要 group by 子句的内容。没有最小值、最大值、总和、计数或平均值。

group by 子句的意义尚不清楚,但这不是你的问题。

【讨论】:

以上是关于选择的字段不包含在 GROUP BY 子句中,那么这个 Access 查询如何成功运行?的主要内容,如果未能解决你的问题,请参考以下文章

选择列表中的无效表达式(不包含在聚合函数或 GROUP BY 子句中)

列的原因在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中[重复]

列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”

选择列表中的 COLUMN 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中

选择列表中的列“X”无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中

SQL:选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中[关闭]