为啥这不起作用? ORA-00979: 不是 GROUP BY 表达式

Posted

技术标签:

【中文标题】为啥这不起作用? ORA-00979: 不是 GROUP BY 表达式【英文标题】:Why doesn't this work? ORA-00979: not a GROUP BY expression为什么这不起作用? ORA-00979: 不是 GROUP BY 表达式 【发布时间】:2021-10-30 00:47:05 【问题描述】:

为什么这不起作用

SELECT FIRST_NAME,
       MIDDLE_NAME,
       LAST_NAME,
       EMP_MOBILE_NO,
       NEW_EMPNO ,
       SECTION_NAME,
       EMP_TYPE,
       JOINING_DATE
FROM EMP_OFFICIAL,EMP_PERSONAL 
where EMP_PERSONAL.STATUS='Active'
  and EMP_OFFICIAL.WORK_ENT='Worker'
  AND  EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO
GROUP BY EMP_OFFICIAL.SECTION_NAMEORDER BY EMP_PERSONAL.NEW_EMPNO DESC

当我通过表达式查询这个节目组

我会尝试但没有找到解决方案

【问题讨论】:

不要标记垃圾邮件...这显然是一个Oracle错误,所以不要随机标记与问题无关的其他RDBMS。 帮助我们帮助您 - 分享表格结构、一些示例数据以及您尝试获得的结果 这是一个印刷错误吗,因为您在 SECTION_NAMEORDER 之间缺少空格/换行符在 GROUP BY 子句中? GROUP BY 在这个查询中应该做什么?它用于聚合表达式 (SUM/AVG/MIN...),但您的 SELECT 子句中没有这样的表达式。删除“GROUP BY EMP_OFFICIAL.SECTION_NAME” 请edit 包含minimal reproducible example 的问题:CREATE TABLE 表的语句;示例数据的 INSERT 语句;以及您的预期输出。您的查询没有意义,因为您没有汇总数据,因此 GROUP BY 似乎无关紧要;如果您展示了您期望的输入和输出,这将有所帮助,以便我们了解您想要实现的目标。 【参考方案1】:

lFirst 没有任何聚合函数(MAX、MIN、SUM、COUNT...),因此不需要 GROUP BY 子句。不要混淆 DISTINCT 行运算符和 GROUP BY 子句。

第二,“BY EMP_PERSONAL.NEW_EMPNO DESC”没有任何意义!它是对 GROUP BY 的补充还是 ORDER BY 的一部分?

要解决第一部分,请将您的查询重写为:

SELECT FIRST_NAME, MIDDLE_NAME,LAST_NAME , EMP_MOBILE_NO,NEW_EMPNO , SECTION_NAME, EMP_TYPE, JOINING_DATE 
FROM   EMP_OFFICIAL,EMP_PERSONAL  
WHERE  EMP_PERSONAL.STATUS='Active' 
  AND  EMP_OFFICIAL.WORK_ENT='Worker'
  AND  EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO 

此外,JOIN 必须与 JOIN 运算符一起写入,而不是作为笛卡尔积后跟限制。因此,将您的查询重写为:

SELECT FIRST_NAME, MIDDLE_NAME,LAST_NAME , EMP_MOBILE_NO,NEW_EMPNO , SECTION_NAME, EMP_TYPE, JOINING_DATE 
FROM   EMP_OFFICIAL
       JOIN EMP_PERSONAL  
          ON EMP_OFFICIAL.EMPNO=EMP_PERSONAL.EMPNO 
WHERE  EMP_PERSONAL.STATUS='Active' 
  AND  EMP_OFFICIAL.WORK_ENT='Worker'

这将由优化器进行最优化,因为它不会分散时间和操作来进行假联接和真联接之间的转换...

【讨论】:

说“必须使用 JOIN 运算符编写 JOIN”是不正确的。逗号连接是遗留的 Oracle 语法,并且完全有效(如果已过时)。 有效并不意味着更快! Oracle 完全接受 ISO 标准连接,因为很多... 无论您是编写标准 ANSI 连接还是过时的逗号连接,优化器都没有区别。 ANSI 连接更具可读性,并且更难错过连接条件,仅此而已。 没有你说的那么简单……事实上,Oracle 优化器和其他优化器一样,都有时间或指令数量的限制,以找到最佳执行计划。当达到这个限制时,会给出最后一个较便宜的计划,但这并不总是最好的。通过在糟糕的 Oracle 旧样式中强制使用愚蠢的伪连接进行一些转换,您获得最强大计划的机会就会减少...... 没有你说的那么简单。 Oracle 解析器通常将内部的 ANSI 连接重写为逗号连接/

以上是关于为啥这不起作用? ORA-00979: 不是 GROUP BY 表达式的主要内容,如果未能解决你的问题,请参考以下文章

SQLSyntaxErrorException: ORA-00979: 不是 GROUP BY 表达式

得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句

ORA-00979: 在使用子查询查询视图时不是 GROUP BY 表达式

关于ORA-00979 不是 GROUP BY 表达式错误的解释

ORA-00979: 不是 GROUP BY 表达式

ORA-00979: 不是 GROUP BY 表达式