学习达梦数据库的递归查询方法
学习达梦数据库的递归查询方法
·
以参考文献2中的采购部组织结构为例,在达梦数据库中创建ROLE表保存角色名称,ROLELINK表保存角色的上下级关系(如下图所示)。由于无法通过Select语句直接把采购经理角色下的所有下级角色一次性查出来,需要使用递归语句循环查询。
根据达梦数据库官网帮助文档(参考文献1)的介绍,递归查询语句的如法如下所示:
--官网原版语法
WITH [RECURSIVE] <递归with cte子句>{,<递归with cte子句>}<cte查询语句>;
<递归with cte子句>::=<公用表表达式的名称> (<列名>{,<列名>}) AS (<定位点成员> UNION ALL <递归成员>)
--个人理解的简化语法
--公用表表达式的名称可以视为递归函数的函数名称
--列名可以视为每次递归的查询结果列,同时也是递归函数最终返回的结果列表
--定位点成员可以视为递归函数的初始化部分,也即产生首轮查询数据的地方,查询结果与列名集合对应
--递归成员可以视为递归函额的嵌套调用部分,也即从函数名称(公用表表达式)及其它表中查询数据,同时
--产生下一轮递归所需的数据
WITH <公用表表达式的名称> (<列名>{,<列名>}) AS (<定位点成员> UNION ALL <递归成员>)
结合上述语法分析,编写了递归查询采购经理角色下的所有下级角色SQL语句,主要内容及查询结果如下所示::
WITH ALLROLES(PNAME,PID,CNAME,CID)AS
(
SELECT a.NAME,a.ID,c.NAME,b.CID from SCHOOL.ROLE a
left join SCHOOL.ROLELINK b on a.ID=b.PID
left join SCHOOL.ROLE c on b.CID=C.ID
where a.ID='1'
UNION ALL
SELECT d.CNAME,d.CID,f.NAME,e.CID from ALLROLES d
left join SCHOOL.ROLELINK e on d.CID=e.PID
left JOIN SCHOOL.ROLE f on e.CID=f.ID
where e.LID is not NULL
)
select * from ALLROLES
参考文献:
[1]https://eco.dameng.com/document/dm/zh-cn/pm/check-phrases
[2]https://www.163.com/dy/article/GAC3535J05527NP8.html
更多推荐
所有评论(0)