我不知道这是否重复,但我无法向正确的方向寻求帮助,因此请问这里。
我有以下表格架构,
菜单{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循环,但我想在一个查询中。
先谢谢!
答案 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;
此处的基本案例是id = 5的条目
递归部分只是选择最后一行的父级并返回它
添加了level
字段以显示我们当前所处的级别。然后它用于按所需顺序排序。