在层次结构中查找顶级父级

Find top parent in hierarchy

我有一个 SQL table 具有不同的项目代码。一个项目可以包含多个级别(子项目)。我想使用 SQL 编码为每个项目代码找到顶级(顶级父级)。

我的 table 看起来像这样:

CREATE TABLE #Temp
(
    Child nvarchar(100),
    Parent nvarchar(100)

)

insert into #Temp (Child,Parent)
values
('17210',Null),
('17210-100','17210'),
('17210-100-100','17210-100'),
('1310',Null),
('1310-100','1310'),
('1310-100-100','1310-100')
;

select * from #Temp

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End

这是我想要的结果:

Child           Parent      TopParent
17210           NULL        17210
17210-100       17210       17210
17210-100-100   17210-100   17210
1310            NULL        1310
1310-100        1310        1310
1310-100-100    1310-100    1310

如何找到每个项目编号(子)的最高父项?我认为使用递归 CTE 可能是解决方案,但我不确定这是否是正确的方法。

非常感谢任何帮助。

我不太确定它与任何其他递归 cte 问题有何不同,但由于您在发布 DDL+DML 示例数据方面做得非常出色,我决定无论如何都要回答这个问题(尽管它可以像复制一样轻松关闭)。

如您所写,使用递归 cte 是这里的解决方案:

WITH cte AS 
(
    SELECT Child, Parent, Child As TopParent
    FROM #Temp
    WHERE Parent IS NULL
    UNION ALL
    SELECT T.Child, T.Parent, cte.TopParent
    FROM #Temp As T
    JOIN cte 
        ON T.Parent = cte.Child
)

SELECT *
FROM cte
ORDER BY TopParent DESC, Parent;

这个问题类似于使用sql语言遍历树。我想你可能需要使用存储过程来解决这个问题。 首先,查询所有记录。遍历一条记录时,通过while循环找到top parent。 但是,需要考虑非法数据。例如,('1', '2'), ('2', '3'), ('3', '1')导致while循环变成无限循环。

试试这个:

CREATE TABLE Category
(
    Child nvarchar(100),
    Parent nvarchar(100)

)

insert into Category (Child,Parent)
values
('17210',Null),
('17210-100','17210'),
('17210-100-100','17210-100'),
('1310',Null),
('1310-100','1310'),
('1310-100-100','1310-100')
;

With cte (Child , Parent, LevelID, topparent)
as
(
    --Anchor
    Select Child , Parent ,0 as LevelID , Child AS TopParent
    From Category
    Where Parent is Null

    Union All

    Select c.Child , c.Parent , cte.LevelID - 1 , cte.TopParent
    From Category c inner join  cte On cte.Child=c.Parent
)

Select c.Child , c.Parent ,cte.TopParent
        From cte

您可以使用 CTE 进行递归查询,并像上面的查询一样为父级查找顶级 ID。 这个模型非常快速和有用。

祝你一切顺利