如何检索从SQL表分层数据?(How to retrieve hierarchical data f

2019-06-25 20:34发布

我有下面的存储过程返回的正常工作标识,parentId的和absoluteUrls列表:

ALTER PROCEDURE [dbo].[SearchDataManager.HierarchyById] 
    @currentId AS int   
AS
BEGIN
 DECLARE @id INT 
 DECLARE @parentId INT
 DECLARE @absoluteUrl NVARCHAR(1000)

 DECLARE @Hierarchy TABLE (Id int, ParentId int, AbsoluteUrl nvarchar(1000))

 WHILE @currentId != 0
 BEGIN

     SELECT @id = Id, @parentId = ParentId, @absoluteUrl = AbsoluteUrl
     FROM dbo.[SearchDataManager.NiceUrls]
     WHERE id = @currentId

     INSERT INTO @Hierarchy  VALUES (@id, @parentId, @absoluteUrl)

    SET @currentId = @parentId
 END

    SELECT * FROM @Hierarchy  
END

该“NiceUrls”表中有编号和的ParentId。 的parentId是指在同一个表中的记录。

它返回这样的:

 ----------------------------------
    Id  | ParentId | AbsoluteUrl
    ----------------------------------
    294 | 5        | url1
    5   | 2        | url2
    2   | 0        | url3

上面的代码工作正常使用while循环,并定义了一个表变量,但我只是想知道有没有什么更好的方法来从表中检索分层数据?

与上述代码的问题是可维护性。 如果我需要返回NiceUrls表1列以上,那么我必须定义一个新的变量,列添加到内联表等。

有没有更好的方式来改写藻?

谢谢,

什么是

Answer 1:

with Hierarchy (Id, ParentId, AbsoluteUrl, Level)
 AS
 (
    -- anchor member
     SELECT Id,
        ParentId,
        AbsoluteUrl,
        0 AS Level   
     FROM dbo.[NiceUrls]
     WHERE id = @currentId
     UNION ALL
     -- recursive members
     SELECT su.Id,
        su.ParentId,
        su.AbsoluteUrl,
        Level + 1 AS Level   
     FROM dbo.[NiceUrls] AS su
     INNER JOIN Hierarchy ON Hierarchy.ParentId = su.Id  
 )
 SELECT * FROM Hierarchy


Answer 2:

看起来像你想从都跟原来的ID源表中的所有记录。

1)创建一个CTE,让你所有的IDS(见三重指出的链接)

2)加入该CTE原始表



文章来源: How to retrieve hierarchical data from a SQL Table?