MySQL 数据库迁移到达梦后,部分GROUP BY语句执行失败,报错如下:
问题原因:
对于Oracle数据库,使用GROUP BY时,SELECT中的非聚合列必须出现在GROUP BY后面,否则就会报上面的错误,达梦默认也有此限制,但MySQL无此限制,这就导致了MySQL数据库迁移到达梦后,如果使用默认参数,此类SQL无法正常执行。
解决方法:
1.修改代码,将对应SQL语句改成符合达梦默认语法(此方法开发通常不会接受);
2.修改达梦数据库参数,兼容MySQL语法(COMPATIBLE_MODE 或 GROUP_OPT_FLAG)。
下面我们采用HINT和修改参数的方式使查询合法
如上图可见,第一次执行语句(红线标注)失败,动态修改GROUP_OPT_FLAG参数(黄线标注)后执行成功(蓝线标注)。在查询语句中增加HINT同样效果(绿线标准)。
本例中t1表的数据如下:
LINEID ID NAME NOTE
---------- --- -------- ----
1 001 beijing
2 001 shanghai
3 002 hangzhou
id为001的记录有两条,name分别是beijing和shanghai。
这里需要说明一下这种方式的逻辑:namel列输出每个ID分组中的首行数据(beijing和hangzhou)。