002:兼容MySQL语法支持非分组项作为查询列
DM技术交流QQ群:940124259
1. 问题描述
很多人习惯性地使用MySQL中非常不规范SQL语法,导致数据库迁移到其他规范化的数据库中,发现原来写的某些视图或者SQL查询放到目标数据库中无法直接运行。
本案例针对MySQL数据库奇葩的语法(分组项未全部出现在查询列),在达梦数据库执行会报错“不是GROUP BY表达式”
,可利用达梦数据库内部支撑参数解决。如果大伙想对这方面更深入的研究,可谓兴致浓厚,请参考我的另一篇博文(地址:《优化篇–玩转达梦SQL改写之分组骚操作》)。
客户现场开发人员,报错截图:
某些人自作聪明地调整语句符合达梦数据库的SQL语法,结果却是错的。
(因为GROUP BY分组项全部出现查询列,查询出来的一整行记录几乎不重复,别个MySQL的初衷是按指定列先进行分组计算,再将分组中第一条与该条记录同行的其他列数据查询出来)
再次报错截图所示:
2. 解决方法
步骤1:先观察MySQL执行查询的查询集,弄清MySQL运算逻辑。
步骤2:达梦数据库先通过 HINT参数指定后执行查询,确认结果集是否与MySQL一致
SELECT /*+ GROUP_OPT_FLAG(5)*/
um.* ,
'751733399179337728' ur_id,
IF ( un.un_id IS NULL, 0, 1 ) checked
FROM
AMS_USER.user_menu um
LEFT JOIN AMS_USER.user_nexus un
ON
um.um_id = un.un_object_id
AND un.um_del_status = 0
AND un.un_type = 2
AND un.un_cover_object_id = '751733399179337728'
WHERE
1 = 1
GROUP BY
um.um_id ;
步骤3: 正式修改兼容参数GROUP_OPT_FLAG,无需重启数据库生效
-- 查询当前GROUP_OPT_FLAG参数值
select * from v$dm_ini where para_name = 'GROUP_OPT_FLAG';
-- 修改参数,文件与内存中参数都生效
ALTER SYSTEM SET 'GROUP_OPT_FLAG' = 5 BOTH;