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

时间:2014-01-23 20:32:56

标签: sql-server tree

我正在寻找如何实现一个查询,该查询返回层次结构中允许特定节点的多个父节点的所有节点的所有级别(在所有级别,因此它包括直接祖先,祖先的祖先等)

给出以下表结构:

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

类似的问题是SQL Server - Get all children of a row in many-to-many relationship?,但我没有成功地将其改编为我的案例。

2 个答案:

答案 0 :(得分:5)

您可以使用递归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)(尽管在执行此操作之前确保查询可以完成)。

答案 1 :(得分:0)

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

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