选择的字段不包含在 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 子句中