查找SQL中最古老祖先的所有后代

时间:2013-04-01 02:15:35

标签: sql sql-server-2008 tsql

我已经尝试了几天来找出这个问题的解决方案,但一直无法得出答案。我所拥有的是一个如下所示的数据集:

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',因为没有后代。

即使看起来我可以在它之后用下划线剥掉任何东西,但我无法保证孩子的名字不会相同。

希望这是有道理的。任何帮助将不胜感激。

1 个答案:

答案 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上的演示