达梦数据库SQL查询报错:不是 GROUP BY 表达式解决方法
1、前言
随着达梦数据库国产化率越来越高,很多如Oracle、Mysql、SQL Server逐步迁移到达梦数据库上来,但难免会有一些其它数据库独有的用法在达梦上会报错,但达梦数据库其实都有相应的解决办法,接下来我们来看一个比较常见的错误,以及如何处理,本文都会详细介绍。
2、问题描述
报错信息:
-4080: 第1 行附近出现错误:
不是 GROUP BY 表达式
**相信大家对这个错误一定不陌生。为何有此报错?达梦数据如何解决呢?下面我们来一探究竟**
3、达梦解决办法
3.1 复现报错
--咋们可以利用达梦数据库内置的员工表测试
select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;
---------报错信息---------------
总共1个语句正依次执行...
[执行语句1]:
select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;
执行失败(语句1)
-4080: 第1 行附近出现错误:
不是 GROUP BY 表达式
1条语句执行失败
3.2 解决办法1:
##达梦支持灵活的处理方式,可以直接在查询中加hint参数。
select /*+ GROUP_OPT_FLAG(1)*/ e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;
101 马学铭 72424
102 程擎武 21592
103 郑吉群 129443
104 陈仙 75945
105 金纬 194399
201 李慧军 45299
202 常鹏程 20491
204 谢俊人 81014
301 苏国华 112344
..............
3.3 解决办法2:
##也可以修改dm.ini参数GROUP_OPT_FLAG=1,动态,会话级参数,不用重启数据库。
select para_name,para_value,file_value from v$dm_ini where para_name='GROUP_OPT_FLAG';
##sp_set_para_value(1,'GROUP_OPT_FLAG',1);
select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;
101 马学铭 72424
102 程擎武 21592
103 郑吉群 129443
104 陈仙 75945
105 金纬 194399
201 李慧军 45299
202 常鹏程 20491
204 谢俊人 81014
301 苏国华 112344
...............
3.4 解决办法3:
达梦还可以配置兼容参数,COMPATIBLE_MODE=4,静态参数,需要重启数据库后生效!
sp_set_para_value(2,'COMPATIBLE_MODE',4);
select para_name,para_value,file_value from v$dm_ini where para_name='COMPATIBLE_MODE';
!!注意修改后需要重启数据库!!
select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;
101 马学铭 72424
102 程擎武 21592
103 郑吉群 129443
104 陈仙 75945
105 金纬 194399
201 李慧军 45299
202 常鹏程 20491
204 谢俊人 81014
301 苏国华 112344
...............
COMPATIBLE_MODE参数解释:
0: 不兼容
1:兼容 SQL92 标准
2: 部分兼容 ORACLE
3: 部分兼容 MS SQL SERVER
4: 部分兼容 MYSQL
5:兼容 DM6
6: 部分兼容 TERADATA
4、GROUP BY注意事项
使用 GROUP BY 要注意以下问题:
1.在 GROUP BY 子句中的每一列必须明确地命名属于在 FROM 子句中命名的表的一列。分组列的数据类型不能是多媒体数据类型;
2.分组列不能为集函数表达式或者在 SELECT 子句中定义的别名;
3.当分组列值包含空值时,则空值作为一个独立组;
4.当分组列包含多个列名时,则按照 GROUP BY 子句中列出现的顺序进行分组;
5. GROUP BY 子句中至多可包含 255 个分组列; 6. ROLLUP\CUBE\GROUPING SETS 组合不能超过 9 个。
达梦技术社区:https://eco.dameng.com