使用MSSQL查询获取父级的所有子元素

11

我在我的数据库中有以下数据:

Parent      Child
101         102
101         103
101         104
101         105
101         106

我的参数是106。我想使用该参数检索其父级101下的所有其他子级。我尝试使用递归方法,但由于以下数据,它没有起作用。是否有另一种方式来制定查询?

4个回答

16
假设您想获取值为@p0兄弟节点,您可以使用简单的自连接:
SELECT p.Child
FROM Table1 c
INNER JOIN Table1 p ON c.Parent = p.Parent
WHERE c.Child = @p0
AND p.Child <> @p0

这里的不等于子句确保您获取的兄弟节点不包括您搜索的值。根据需要删除它。 SQL Fiddle示例

由于你提到了递归,也许你想要从值@p0的父级开始获取整个树。在这种情况下,你可以使用递归CTE:

WITH parent AS (
    SELECT Parent
    FROM Table1
    WHERE Child = @p0
), tree AS (
    SELECT x.Parent, x.Child
    FROM Table1 x
    INNER JOIN parent ON x.Parent = parent.Parent
    UNION ALL
    SELECT y.Parent, y.Child
    FROM Table1 y
    INNER JOIN tree t ON y.Parent = t.Child
)
SELECT Parent, Child
FROM tree

SQL Fiddle示例 使用您的数据使用其他数据演示递归CTE


兄弟姐妹?但他写道“获取父节点的所有子节点...”我如何获取给定值(父节点)的整个子树 - 子树的根? - candlejack
兄弟姐妹在同一“层级”,就像兄弟一样。我错了吗? - candlejack
@alessandro 没错。示例数据也只有一个级别。如果您想要从给定 ID 的父级开始的整个树,请查看此答案的后半部分。 - lc.
我使用phpMyAdmin与MariaDB,但它没有“WITH”函数 :( - candlejack
@Ic. 你能告诉我MariaDB的等效版本吗?谢谢。 - candlejack
显示剩余2条评论

7

-1
select child
from my_table T1
where exists (select 1 from my_table T2 where child = @parameter and T1.parent = T2.parent)

-2
WITH parent AS (
    SELECT Parent
    FROM Table1
    WHERE Child = @p0
), tree AS (
    SELECT x.Parent, x.Child
    FROM Table1 x
    INNER JOIN parent ON x.Parent = parent.Parent
    UNION ALL
    SELECT y.Parent, y.Child
    FROM Table1 y
    INNER JOIN tree t ON y.Parent = t.Child
)
SELECT Parent, Child
FROM tree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接