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

Posted

技术标签:

【中文标题】错误:选择列表中的表达式无效(不包含在聚合函数或 GROUP BY 子句中)【英文标题】:Error: Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause) 【发布时间】:2021-08-13 17:23:16 【问题描述】:

我正在使用 Firebird SQL。下面提到的查询返回如图所示的 4 行。

    SELECT a.EPS_ID,b.C_NAME,c.AY_YR_NAME,d.S_NAME,e.E_NAME
FROM 
    TBLEXAMPLANNER_S_MSB a, 
    TBLCLASS_MSB b, 
    TBLACADEMICYEAR_MSB c, 
    TBLSUBJECTS_MSB d, 
    TBLEXAMTYPE_MSB e
WHERE 
    a.EPS_CLASS_ID=b.C_ID 
AND a.EPS_SESSION_ID=c.AY_ID 
AND a.EPS_SUB_ID=d.S_ID 
AND a.EPS_PE_ID=e.E_ID

我希望它只返回 1(one) 行

EPS_ID     C_NAME    AY_YR_NAME   S_NAME   E_NAME
---------------------------------------------------
7          5         2016-2017    English  FA1 

我正在使用以下查询,但它不起作用。

SELECT a.EPS_ID,MAX(b.C_NAME) AS XT,c.AY_YR_NAME,d.S_NAME,e.E_NAME
FROM 
    TBLEXAMPLANNER_S_MSB a, 
    TBLCLASS_MSB b, 
    TBLACADEMICYEAR_MSB c, 
    TBLSUBJECTS_MSB d, 
    TBLEXAMTYPE_MSB e
WHERE 
    a.EPS_CLASS_ID=b.C_ID 
AND a.EPS_SESSION_ID=c.AY_ID 
AND a.EPS_SUB_ID=d.S_ID 
AND a.EPS_PE_ID=e.E_ID
GROUP BY a.EPS_ID,d.S_NAME

错误信息是:

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

【问题讨论】:

你试过SELECT DISTINCT 我也无法使 DISTINCT 与我的查询一起工作:( 如错误消息所述,您需要在GROUP BY 表达式中列出SELECT 列表(非聚合)中使用的任何列 一般的 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数! 您如何知道要在您想要的单个行中返回哪个EPS_ID 【参考方案1】:

GROUP BY 的使用使引擎group 为您提供记录。要进行分组,您必须为 每个 列向 RDBMS 提供建议,它应该做什么。

分组? -> 将列添加到GROUP BY-Clause 没有分组吗? -> 好的,还有什么? 忽略列?从您的选择子句中删除它 求和? -> 使用SUM(mycol) 其他聚合函数见documentation

另外:在您的情况下,您尝试按EPS_ID 分组,这在每一行中都是唯一的。因此,按该列进行 分组 将返回所有行,因为没有可分组依据。要对记录进行分组,它们必须具有相同的值。

【讨论】:

【参考方案2】:

学习使用正确、明确的JOIN 语法。

您的问题是 所有 未聚合的列需要在 GROUP BY:

SELECT a.EPS_ID, MAX(b.C_NAME) AS XT, c.AY_YR_NAME, d.S_NAME, e.E_NAME
FROM TBLEXAMPLANNER_S_MSB a JOIN 
     TBLCLASS_MSB b
     ON a.EPS_CLASS_ID = b.C_ID JOIN
     TBLACADEMICYEAR_MSB c
     ON a.EPS_SESSION_ID = c.AY_ID JOIN
     TBLSUBJECTS_MSB d
     ON a.EPS_SUB_ID = d.S_ID JOIN 
     TBLEXAMTYPE_MSB e
     ON a.EPS_PE_ID = e.E_ID
GROUP BY a.EPS_ID, c.AY_YR_NAME, d.S_NAME, e.E_NAME;

注意:我还建议您对表别名使用表缩写。所以,ep 代表 TBLEXAMPLANNER_S_MSB 而不是 a。任意表别名使查询难以理解。

【讨论】:

感谢@gordon,但它仍然显示了 4 行,如附图所示【参考方案3】:

试试

SELECT a.EPS_ID,c.AY_YR_NAME,d.S_NAME,e.E_NAME,MAX(b.C_NAME) AS XT ...
GROUP BY 1,2,3,4

【讨论】:

虽然这段代码可能有助于解决问题,但它并没有解释为什么和/或如何回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。

以上是关于错误:选择列表中的表达式无效(不包含在聚合函数或 GROUP BY 子句中)的主要内容,如果未能解决你的问题,请参考以下文章

选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”

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

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

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

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