zoukankan      html  css  js  c++  java
  • CTE-递归[2]

    在此之前写过一个CTE的递归,取出了所有的子节点,基本上可以满足大多数的需求,这里我们来延伸一下:首先我们回顾下原来的场景

    图片的上半部分递归查出某个节点的所有子节点,这个我们已经通过CTE实现了,可是有的时候我们需要全路径,也就是图片上的下半部分,怎么来弄呢,延续原来的思路,同样用CTE来实现:

    CREATE TABLE #t(id VARCHAR(20),pid VARCHAR(20),NAME VARCHAR(20),fullpath varchar(200))
     
    INSERT INTO #t
    SELECT '001',NULL,'广东省','' UNION ALL
    SELECT '002','001','广州市','' UNION ALL
    SELECT '003','001','深圳市','' UNION ALL
    SELECT '004','002','天河区','' UNION ALL
    SELECT '005','003','罗湖区','' UNION ALL
    SELECT '006','003','福田区','' UNION ALL
    SELECT '007','003','宝安区','' UNION ALL
    SELECT '008','007','西乡镇','' UNION ALL
    SELECT '009','007','龙华镇','' UNION ALL
    SELECT '010','007','松岗镇','' 
      
     
    ;WITH mycte AS
    (
    SELECT id,pid,NAME,levels=0 FROM #t WHERE id='001' --CTE
    UNION ALL
    --    字段的选取同样重要
    SELECT b.id,b.pid,b.NAME,levels=levels+1 FROM mycte a,#t b WHERE b.pid=a.id --通过CTE的ID与原始表的PID来匹配记录
    )
    SELECT * FROM mycte
    
    
    ;WITH myCTE AS 
    (
    	SELECT id,pid,Convert(nvarchar(500),NAME) NAME,level=0,fullpath FROM #t WHERE id='001'--基础语句
    	UNION ALL 
    	SELECT a.id,a.pid,Convert(nvarchar(500),B.NAME+'/'+Isnull(A.Name,'')),level=b.level+1,a.fullpath FROM #t a INNER JOIN myCTE b ON  a.pid=b.id --循环部分  
    )
    update #t set fullpath=b.NAME from #t a left join myCTE b on a.id=b.id
    
     
    

     这样我们就可以轻松获取全路径了。

  • 相关阅读:
    分布式锁实战,分布式锁方案选择
    数据库索引调优技巧
    GraphQL
    PDF添加水印
    word添加水印,.NET执行宏
    『OpenCV』在Cmake中设置指定的OpenCV路径
    『论文笔记』ArcFace: Additive Angular Margin Loss for Deep Face Recognition
    Dapr微服务应用开发系列3:服务调用构件块
    ClearLinux安装教程
    tail命令学习实例
  • 原文地址:https://www.cnblogs.com/mfkaudx/p/3520502.html
Copyright © 2011-2022 走看看