在层次结构中查找顶级父级
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。
这个模型非常快速和有用。
祝你一切顺利
我有一个 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。
这个模型非常快速和有用。
祝你一切顺利