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

  • 相关阅读:
    教准备租房的同学如何避开坑!
    mvc3中controler和view之间的数据传递
    WebMail发送邮件
    mvc Razor视图语法与Aspx视图语法对比
    SQL Server sql分页查询
    WCF之一
    C++总结笔记(一)抽象、多态、继承
    Perl脚本学习经验(二)常用命令举例
    makefile学习经验(四)编译生成动态库文件(方式二)
    makefile学习经验(三)编译生成动态库文件(方式一)
  • 原文地址:https://www.cnblogs.com/wintersun/p/1650915.html
Copyright © 2011-2022 走看看