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

  • 相关阅读:
    P2519 [HAOI2011]problem a
    P1084 疫情控制
    P1941 飞扬的小鸟
    NOIP填坑计划
    P2831 愤怒的小鸟
    AGC 16 D
    P3960 列队
    Python3爬虫相关软件,库的安装
    软件理论基础—— 第一章命题逻辑系统L
    软件理论基础——导论
  • 原文地址:https://www.cnblogs.com/wintersun/p/1650915.html
Copyright © 2011-2022 走看看