我已经尝试了几天来找出这个问题的解决方案,但一直无法得出答案。我所拥有的是一个如下所示的数据集:
Id ParentId Name
16 NULL i_ss_16_Grommets
25 16 ss_25_Grommets
26 NULL inactive_Grommets Clone
27 NULL inactive_Grommets Clone Clone
46 25 ss_46_Grommets
47 46 ss_47_Grommets
48 47 Grommets
我需要提出的是一个函数,我可以传递一个Id,然后获取正确的名称。我需要找到名称的方式涉及一种反向层次结构,因为它是将要使用的分支中最小的子项。例如,如果我传入Id 46,我需要函数返回'Grommets'。如果我通过Id 47,我需要看到'Grommets',如果我通过Id 26,我会看到'inactive_Grommets Clone',因为没有后代。
即使看起来我可以在它之后用下划线剥掉任何东西,但我无法保证孩子的名字不会相同。
希望这是有道理的。任何帮助将不胜感激。
答案 0 :(得分:1)
具有递归CTE的选项
DECLARE @Id int = 46
;WITH cte AS
(
SELECT Id, ParentId, Name
FROM dbo.test60
WHERE Id = @Id
UNION ALL
SELECT t.Id, t.ParentId, t.Name
FROM dbo.test60 t JOIN cte c ON t.ParentId = c.Id
)
SELECT TOP 1 *
FROM cte
ORDER BY Id DESC
SQLFiddle上的演示