zoukankan      html  css  js  c++  java
  • SQL SERVER 2008 CTE生成结点的FullPath

           SQL SERVER 2008 使用CTE是经常的事儿,有时我们想存储一些冗余数据,像每个结点的FullPath。好的,现在来看如何生成FullPath:

    DECLARE @tbl TABLE 
      (  
       Id int 
      ,ParentId int 
      ) 
     
    INSERT  INTO @tbl 
            ( Id, ParentId ) 
    VALUES  ( 0, NULL ) 
    ,       ( 8, 0 ) 
    ,       ( 12, 8 ) 
    ,       ( 16, 12 ) 
    ,       ( 17, 16 ) 
    ,       ( 18, 17 ) 
    ,       ( 19, 17 ) 
     
    ; 
    WITH  abcd 
            AS ( 
                  -- anchor 
                SELECT   id 
                        ,ParentID 
                        ,CAST(id AS VARCHAR(100)) AS [Path] 
                FROM    @tbl 
                WHERE   ParentId IS NULL 
                UNION ALL 
                  --recursive member 
                SELECT  t.id 
                       ,t.ParentID 
                       ,CAST(a.[Path] + ',' + CAST( t.ID AS VARCHAR(100)) AS varchar(100)) AS [Path] 
                FROM    @tbl AS t 
                        JOIN abcd AS a ON t.ParentId = a.id 
               ) 
    SELECT  Id ,ParentID ,[Path] 
    FROM    abcd 
    WHERE   Id NOT IN ( SELECT  ParentId 
                        FROM    @tbl 
                        WHERE   ParentId IS NOT NULL ) 

    返回:

    Id          ParentID    Path
    ----------- ----------- ----------------------
    18          17          0,8,12,16,17,18
    19          17          0,8,12,16,17,19

    就这么简单,实际上有Sql server 2008中HierarchyType 也能很好的解决这个问题。我将在后面写一些关于HierarchyType的Post.

    希望这篇POST对您有帮助。

    Author Peter Liu http://wintersun.cnblogs.com

  • 相关阅读:
    《Metasploit 渗透测试魔鬼训练营》 攻击机无法攻击靶机
    Ubuntu 解压 RAR
    verilog实验2:基于FPGA的59秒计时器设计
    verilog实验1:基于FPGA蜂鸣器演奏乐曲并数码管显示
    Java基础之反射和动态代理
    Redis初探
    Rest(表述性状态转移)
    深入理解MVC模式
    @Controller和@RestController的区别
    solrconfig.xml和schema.xml说明
  • 原文地址:https://www.cnblogs.com/wintersun/p/1650915.html
Copyright © 2011-2022 走看看