【问题标题】:SQL: Retrieving up to the parent rows for any of the child row in a same table [closed]SQL:检索同一表中任何子行的父行[关闭]
【发布时间】:2014-07-06 09:01:05
【问题描述】:

我不知道这是否重复,但我无法在正确的方向上获得帮助,因此在这里询问。

我有以下表格架构,

菜单 {ID, ParentID, Name}

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

例如,这是我的数据:

{1, 0, 主页}

{2, 1, 系统}

{3, 1, 数据}

{4、2、设置}

{5、2、访问}

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

它是一种子-父检索东西,我可以使用 while 循环来完成,但我希望它在一个查询中。

提前致谢!

【问题讨论】:

  • 这是一个根/叶节点问题,本站有很多相关/重复问题。你都尝试了些什么?大多数解决方案倾向于使用递归 CTE - 在遵循任何示例之后,您的查询中的哪些内容不起作用?

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


【解决方案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 字段以显示我们当前处于哪个级别。然后它被用来按所需的顺序订购东西。

【讨论】:

  • 太棒了!像魅力一样工作!
  • 还有一个帮助,有没有办法从父母订购它到孩子?例如这里我想按这个顺序主页 > 系统 > 访问。
  • @PratikGaloria 用可以订购的水平计数器更新了答案。
  • 天才!!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2015-05-18
  • 2011-12-22
  • 1970-01-01
  • 2013-06-25
相关资源
最近更新 更多