我正在寻找如何实现返回所有祖先的查询(在各个层面,因此它包括直接祖先,祖先的祖先等),以供层次结构中的所有节点这允许多个父母的特定节点。
给定下表结构:
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
感兴趣,则可以查看此信息。