递归查询

有时候表结构是层级关系的父子结构,要查出所有有的子,可用如下的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
复制代码

 

posted @   爱生活,爱代码  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2017-10-28 状态模式例子---流程控制
点击右上角即可分享
微信分享提示