为啥这不起作用? 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_NAME
和 ORDER
之间缺少空格/换行符在 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 表达式