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

标签 sql-server-2008 recursion

我在 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 是同一个表中 Id 的 FK。我想创建一个 View ,结果如下:
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 的hierarchyid 功能,但据我所知,它只适用于固定数量的递归级别。但是,就我而言,您永远不知道会找到多少个级别,并且它们可能会逐行更改。

我也在这里看到了与此类似的问题。但是,我认为没有人要求为表中的每一行构建“路径”。对不起,如果我错过了。

非常感谢。

最佳答案

试试这个:

    DECLARE @tbl TABLE (
         Id INT
        ,[Name] VARCHAR(20)
        ,ParentId INT
        )

    INSERT INTO @tbl( Id, Name, ParentId )
    VALUES
     (1, 'Europe', NULL)
    ,(2, 'Asia',   NULL)
    ,(3, 'Germany', 1)
    ,(4, 'UK',      1)
    ,(5, 'China',   2)
    ,(6, 'India',   2)
    ,(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

关于sql-server-2008 - SQL Server 2008 中的递归同表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757370/

相关文章:

c# - Linq to Entities : see the resulting query (context. Log = Console.Out)

sql-server - 通过检查现有数据启用外键

java - 删除 BST 中的节点(2)

sql-server - 列数不一致的 BULK INSERT

sql - 在哪里下载 SQL Server Management Studio 2008(非速成版)?

sql-server - 简单存储过程问题

java - 用两个递归案例确定递归方法的大 O?

python - 当我使用 Manager 时,Django 执行向后关系查询发生最大递归深度超出错误

c# - 如何删除递归嵌套列表中的重复项

haskell - 无法理解相互递归