查询在SQL中找到给定节点的所有父节点和子节点

Query to find all the parent and child nodes of a given node in SQL

我见过很多使用CTE获取SQL中所有子节点(包括当前节点)的例子。简单示例如下:

;WITH #results AS
(
    SELECT  ChildId, 
            ParentId 
    FROM    History
    WHERE   ChildId= @selected
    UNION ALL
    SELECT  t.ChildId, 
            t.ParentId 
    FROM    History t
            INNER JOIN #results r ON r.ExpirationList = t.ParentId 
)
SELECT  *
FROM    #results;

上面的查询为我提供了给定节点的所有子节点。例如: A -> B -> C -> D -> E 并且我通过 @selected = "C",然后我得到结果 C -> D -> E.

我的问题是如何获得完整的链,而不管我传递的是什么。 如果@selected = "D",那么我希望结果为 A -> B -> C -> D -> E 和 如果@selected = "A",那么我希望结果为 A -> B -> C -> D -> E.

我想要给定节点的父节点和子节点。有人可以帮我查询吗?

这应该有效:

;WITH #results1 AS
(
    SELECT  ChildId, 
            ParentId 
    FROM    History
    WHERE   ChildId= @selected
    UNION ALL
    SELECT  t.ChildId, 
            t.ParentId 
    FROM    History t
            INNER JOIN #results1 r ON r.ExpirationList = t.ParentId 
)
,#results2 AS
(
    SELECT  ChildId, 
            ParentId 
    FROM    History
    WHERE   ChildId= @selected
    UNION ALL
    SELECT  t.ChildId, 
            t.ParentId 
    FROM    History t
            INNER JOIN #results2 r ON t.ExpirationList = r.ParentId 
)
SELECT  *
FROM    #results1
UNION
SELECT  *
FROM    #results2

我将 2 个 CTE(一个用于查找 child,另一个用于 parents)合并到公共临时文件 table 中,然后从中提取记录。

我参考了下面的代码项目 post 这很有帮助。 http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical-or-parent-child

感谢您的建议和回复。