2

几天来,我一直在尝试找出解决此问题的方法,但未能找到答案。我拥有的是一个如下所示的数据集:

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

尽管看起来我可以去掉后面带下划线的任何东西,但我不能这样做,因为不能保证孩子的名字会相同。

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

4

1 回答 1

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

于 2013-04-01T07:28:18.027 回答