SQL Server中有多个父母的层次结构



我正在寻找如何实现返回所有祖先的查询(在各个层面,因此它包括直接祖先,祖先的祖先等),以供层次结构中的所有节点这允许多个父母的特定节点。

给定下表结构:

Table Nodes: Id, Name
Table Relations: IdNode, IdParentNode

SQL Server也是一个类似的问题 - 在多到多的关系中让所有的孩子都可以吗?但是我没有成功地适应我的情况。

您可以使用递归CTE:

DECLARE @IdNode INT -- use the correct data type
SET @IdNode = 1  -- here use the node you want to search
;WITH CTE AS
(
    SELECT  IdNode, 
            IdParentNode Ancestor, 
            1 TreeLevel
    FROM Relations
    WHERE IdNode = @IdNode
    UNION ALL
    SELECT  A.IdNode, 
            B.IdParentNode,
            TreeLevel + 1
    FROM CTE A
    INNER JOIN Relations B
        ON A.Ancestor = B.IdNode
)
SELECT *
FROM CTE
OPTION(MAXRECURSION 200)

OPTION(MAXRECURSION 200)意味着它看起来只有200个深度,如果要为所有级别进行设置,则可以使用OPTION(MAXRECURSION 0)(尽管请确保查询可以在此之前完成)。

由于您想查询层次结构,因此可以使用hierarchyid并从中受益匪浅。这将使您能够查询特定的级别并进行高级查询,以根据节点级别进行过滤和汇总数据,等等。它还可以让您返回特定节点的所有孩子,这是您想做的。

但是,这也意味着使用与列出的表结构不同的表结构。如果您对hierarchyid感兴趣,则可以查看此信息。

最新更新