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
    
     
    

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

  • 相关阅读:
    webpack实践(三)- html-webpack-plugin
    webpack实践(二)- webpack配置文件
    webpack实践(一)- 先入个门
    VueRouter爬坑第三篇-嵌套路由
    VueRouter爬坑第二篇-动态路由
    chrome中安装Vue调试工具vue-devtools
    VueRouter爬坑第一篇-简单实践
    使用vue-cli搭建项目开发环境
    Jmeter基础001----jmeter的安装与配置
    接口测试基础001----接口、接口测试
  • 原文地址:https://www.cnblogs.com/mfkaudx/p/3520502.html
Copyright © 2011-2022 走看看