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

时间:2016-10-24 19:20:43

标签: sql parent-child common-table-expression

我已经看到许多使用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.

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

2 个答案:

答案 0 :(得分:0)

这应该有效:

;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

答案 1 :(得分:0)

我将2个CTE(一个用于查找子项,另一个用于父项)组合到公共临时表中,然后从中删除记录。

我参考了下面的codeproject帖子,它很有帮助。 http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical-or-parent-child

感谢您的建议和回复。