递归查询
有时候表结构是层级关系的父子结构,要查出所有有的子,可用如下的sql,递归查询,以mysql为例:
1、查出父下所有子
WITH RECURSIVE producttype AS( SELECT '03f9096d-bd5d-11ed-a58a-7af8c5058daf' FinanClass, id,protypeid,typename,typelevel FROM t_base_commontype WHERE id='03f9096d-bd5d-11ed-a58a-7af8c5058daf' UNION ALL SELECT '03f9096d-bd5d-11ed-a58a-7af8c5058daf' FinanClass,a.id,a.protypeid,a.typename,a.typelevel FROM t_base_commontype AS a,producttype AS b WHERE a.id = b.protypeid ) SELECT * FROM producttype
得到的结果如下:
2、还可以把查询的结果插入到临时表:
CREATE TABLE #temp_producttype ( FinanClass VARCHAR(50) , id VARCHAR(36) , protypeid VARCHAR(36), typename VARCHAR(50), typelevel VARCHAR(10) ); WITH RECURSIVE producttype AS( SELECT '03f9096d-bd5d-11ed-a58a-7af8c5058daf' FinanClass, id,protypeid,typename,typelevel FROM t_base_commontype WHERE id='03f9096d-bd5d-11ed-a58a-7af8c5058daf' UNION ALL SELECT '03f9096d-bd5d-11ed-a58a-7af8c5058daf' FinanClass,a.id,a.protypeid,a.typename,a.typelevel FROM t_base_commontype AS a,producttype AS b WHERE a.id = b.protypeid ) insert into #temp_producttype SELECT * FROM producttype
3、将查询出来的值进行行转列
WITH RECURSIVE producttype AS( SELECT '03f9096d-bd5d-11ed-a58a-7af8c5058daf' FinanClass, id,protypeid,typename,typelevel FROM t_base_commontype WHERE id='03f9096d-bd5d-11ed-a58a-7af8c5058daf' UNION ALL SELECT '03f9096d-bd5d-11ed-a58a-7af8c5058daf' FinanClass,a.id,a.protypeid,a.typename,a.typelevel FROM t_base_commontype AS a,producttype AS b WHERE a.id = b.protypeid ) SELECT FinanClass, GROUP_CONCAT(typename SEPARATOR '-') FROM producttype where protypeid <>'00000000-0000-0000-0000-000000000000' GROUP BY FinanClass;
4、将查询出来行转成多列
WITH RECURSIVE producttype AS( SELECT '03f9096d-bd5d-11ed-a58a-7af8c5058daf' FinanClass, id,protypeid,typename,typelevel FROM t_base_commontype WHERE id='03f9096d-bd5d-11ed-a58a-7af8c5058daf' UNION ALL SELECT '03f9096d-bd5d-11ed-a58a-7af8c5058daf' FinanClass,a.id,a.protypeid,a.typename,a.typelevel FROM t_base_commontype AS a,producttype AS b WHERE a.id = b.protypeid ) select t.FinanClass,max(t.一级) '一级',max(t.二级) '二级',max(t.三级) '三级',max(t.四级) '四级' from (SELECT FinanClass, case when typelevel=1 then typename else '' end as '一级', case when typelevel=2 then typename else '' end as '二级', case when typelevel=3 then typename else '' end as '三级', case when typelevel=4 then typename else '' end as '四级' FROM producttype where protypeid <>'00000000-0000-0000-0000-000000000000' ) t group by t.FinanClass
分类:
06-SQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2017-10-28 状态模式例子---流程控制