数据库SQL高阶操作1——Mysql8转换DM8相关sql语法写法优化调整,包括递归,函数,以及方言等特殊操作的改造支持
在实际项目开发过程中,尤其是当前各国之间的技术博弈异常剧烈,加上国内对于开源项目或者国产项目的支持度越来越高,因此在适配有关涉及国内政府高校以及国央企单位项目时,DM数据库的选择成了一个必需的操作,也是一个不得已而为之的选择,所以才有了Mysql8转换DM8改造和调整这篇文章。
序言:dm数据库可视化链接工具
官方推荐可使用SQLark,官方链接如下:
https://www.sqlark.com/
一.字符串转换出错
在mysql语法的查询中,即使数据类型不一致的情况下依然可以正常执行查询,但是DM在关联查询是必需保证关联条件的数据类型一致。
二.递归语法改造,可参照oracle语法
1.DM8下递归语法的说明
select fie1,fie2...
from tab1
-- 开始查询的父级条件,也可以是where后面的查询条件
-- 如果没有,可以写成查询所有“START WITH 1 = 1”
START WITH pid = '66c59905'
-- 关联子级的条件(需要参照START WITH来确定)
-- 从树的根节点依次往下(最后的叶节点)查询:PRIOR id = pid
-- 从树的最后叶节点依次往上(到根节点)查询:id = PRIOR pid
CONNECT BY PRIOR id = pid
其他相关具体请参考dm下语法和示例说明:
DM8递归语法说明1
DM8递归语法说明2
DM8递归语法说明3
2.Mysql8下递归基础写法
with RECURSIVE sDBa as (select * fromServ_Area_Infowherepid = '66c59905'unionselect defAreaDB.* fromServ_Area_Info defAreaDBinner join sDBa as PRIOR on PRIOR.id = defAreaDB.pid)
select * from sDBa
3.DM8下基于Mysql8基础递归语法改造
select * from Serv_Area_Info
START WITH pid = '66c59905'
CONNECT BY PRIOR id = pid
4.Mysql8下递归关联子查询
with RECURSIVE sDBa as
( select * from Serv_Area_Info where id in ( select defenceAreaId from Serv_defenceArea where relateId = '66c59905' ) union select defAreaDB.* from Serv_Area_Info defAreaDB inner join sDBa as PRIOR on PRIOR.id = defAreaDB.pid
)
select * from sDBa
5.DM8下基于Mysql8递归关联子查询改造
select id from Serv_Area_Info
START WITH
id in ( select defenceAreaId from Serv_defenceArea where relateId = '66c59905' )
CONNECT BY PRIOR id = pid
三.不同数据库的方言和函数改造说明
1.DM8数据库不支持【`fie`】,须使用单引号或者双引号'fie'
2.Mysql8字符串分析函数 group_concat()在DM8下不支持,须使用WM_Concat()