sql-server-2008 – SQL Server 2008中的递归同表查询

前端之家收集整理的这篇文章主要介绍了sql-server-2008 – SQL Server 2008中的递归同表查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在sql Server 2008数据库中有以下表格:
Id  Name       ParentFolder
--  ----       ------------
1   Europe     NULL
2   Asia       NULL
3   Germany    1
4   UK         1
5   China      2
6   India      2
7   Scotland   4

ParentFolder是同一个表中的FK到Id.我想创建一个导致如下的视图:

Id  Name       FullName
--  ----       --------
1   Europe     Europe
2   Asia       Asia
3   Germany    Europe/Germany
4   UK         Europe/UK
5   China      Asia/China
6   India      Asia/India
7   Scotland   Europe/UK/Scotland

正如你所看到的,我需要通过递归地使用ParentFolder关系来构造FullName值任意次数,直到找到NULL.

编辑.表中的每一行“知道”其他行是其父对象,但不知道其在层次结构中的绝对位置.因此,每行将其绝对位置存储在层次结构树中的谱系系统将不合适.

我知道sql Server 2008的层次化功能,但据我所知,它只适用于固定数量的递归级别.然而,在我的情况下,你永远不会知道你会发现多少级别,并且它们可能会从一行到另一行改变.

我也看到了类似的问题.但是,我认为没有人问到在表中的每一行建立“路径”.对不起,如果我错过了

非常感谢.

解决方法

尝试这个:
DECLARE @tbl TABLE (
         Id INT,[Name] VARCHAR(20),ParentId INT
        )

    INSERT INTO @tbl( Id,Name,ParentId )
    VALUES
     (1,'Europe',NULL),(2,'Asia',(3,'Germany',1),(4,'UK',(5,'China',2),(6,'India',(7,'Scotland',4),(8,'Edinburgh',7),(9,'Leith',8)

    ;
WITH  abcd
        AS (
              -- anchor
            SELECT  id,[Name],ParentID,CAST(([Name]) AS VARCHAR(1000)) AS "Path"
            FROM    @tbl
            WHERE   ParentId IS NULL
            UNION ALL
              --recursive member
            SELECT  t.id,t.[Name],t.ParentID,CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) AS "Path"
            FROM    @tbl AS t
                    JOIN abcd AS a
                      ON t.ParentId = a.id
           )
SELECT * FROM abcd
原文链接:https://www.f2er.com/mssql/81804.html

猜你在找的MsSQL相关文章