达梦数据库SQL查询报错不是 GROUP BY 表达式解决方法

达梦数据库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

  • 15
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当使用group by进行分组查询时,如果group by后的字段与select后查询的字段不一致,就会报错报错信息如下:#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by。\[1\]这个错误在达梦数据库中也存在。解决这个问题有几种方法。一种是补全group by后的字段,但这种方法不推荐,因为如果要查询的字段很多且内容不能保证不重复,补全所有字段会导致查询数据丢失。另一种方法是修改配置,可以使用navicat管理工具连接mysql数据库,然后在命令界面中输入以下语句来修改配置:select @@global.sql_mode; set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';\[3\]这样就可以解决group by查询数据库报错的问题了。 #### 引用[.reference_title] - *1* *3* [高版本Mysql使用group by 分组报错](https://blog.csdn.net/qq_43486404/article/details/126744365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [达梦数据库SQL查询报错不是 GROUP BY 表达式解决方法](https://blog.csdn.net/qq_37898570/article/details/126951104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值