我正在寻找如何实现一个查询,该查询返回层次结构中允许特定节点的多个父节点的所有节点的所有级别(在所有级别,因此它包括直接祖先,祖先的祖先等)
给出以下表结构:
Table Nodes: Id, Name
Table Relations: IdNode, IdParentNode
类似的问题是SQL Server - Get all children of a row in many-to-many relationship?,但我没有成功地将其改编为我的案例。
答案 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。