来自树形式的自引用表的分层数据

Bet*_*033 3 sql sql-server

看起来在所有简单的情况下都会被问到和回答,不包括那个我遇到麻烦的情况.我尝试过使用递归CTE来生成这个; 但是光标会更好吗?或者也许一组递归函数可以解决这个问题?

这可以在cte中完成吗?

考虑下表

PrimaryKey   ParentKey  
1            NULL       
2            1       
3            6
4            7
5            2
6            1
7            NULL
Run Code Online (Sandbox Code Playgroud)

应该屈服

PK
1
-2
--5
-6
--3
7
-4
Run Code Online (Sandbox Code Playgroud)

其中 - 标记的数量等于深度,我的主要难点是排序.

Aar*_*ght 8

这与邻接列表模式有关,但它可以通过递归CTE完成:

WITH Hierarchy AS
(
    SELECT
        PrimaryKey, ParentKey,
        CAST('/' + CAST(PrimaryKey AS varchar(10)) AS varchar(50)) AS [Path],
        CAST('' AS varchar(50)) AS Prefix
    FROM @Tbl
    WHERE ParentKey IS NULL

    UNION ALL

    SELECT
        t.PrimaryKey, t.ParentKey,
        CAST(h.[Path] + '/' + CAST(t.PrimaryKey AS varchar(10)) AS varchar(50)),
        CAST(h.Prefix + '-' AS varchar(50))
    FROM Hierarchy h
    INNER JOIN @Tbl t
        ON t.ParentKey = h.PrimaryKey
)
SELECT [Path], Prefix + CAST(PrimaryKey AS varchar(10)) AS Node
FROM Hierarchy
ORDER BY [Path]
Run Code Online (Sandbox Code Playgroud)

要获得所需的确切结果,您需要Prefix列(执行"缩进")和代理Path列(实际执行排序).