SQL:检索同一个表中任何子行的父行

时间:2014-05-18 08:51:21

标签: sql sql-server stored-procedures recursion parent-child

我不知道这是否重复,但我无法向正确的方向寻求帮助,因此请问这里。

我有以下表格架构,

菜单{ID,ParentID,Name}

我想要做的是我想要一个存储过程,当我将ID作为参数传递时,我想要这个ID的所有父行,直到ParentID为0。

例如,这是我的数据:

{1,0,Home}

{2,1,系统}

{3,1,数据}

{4,2,设置}

{5,2,Access}

因此,当我将5作为参数传递给存储过程时,我希望它返回Access,System和Home。请注意,ParentID与ID没有紧密耦合,因此它可以包含0,其中0表示所有子节点的父节点。

它的子父级检索的东西,我可以使用while循环,但我想在一个查询中。

先谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用递归公用表表达式来获得所需内容;

WITH cte AS (
  SELECT *, 1 AS level FROM menu WHERE id=5
  UNION ALL
  SELECT menu.*, cte.level + 1 AS level FROM menu
  JOIN cte ON menu.id = cte.parentid
)
SELECT * FROM cte
ORDER BY level DESC;

An SQLfiddle to test with

此处的基本案例是id = 5的条目 递归部分只是选择最后一行的父级并返回它 添加了level字段以显示我们当前所处的级别。然后它用于按所需顺序排序。