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

use*_*183 1 sql-server tree

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

给出以下表结构:

Table Nodes: Id, Name
Table Relations: IdNode, IdParentNode
Run Code Online (Sandbox Code Playgroud)

一个类似的问题是SQL Server - 以多对多的关系获取连续的所有孩子?,但我没有成功地适应我的情况.

Lam*_*mak 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)
Run Code Online (Sandbox Code Playgroud)

OPTION(MAXRECURSION 200)意味着它只能看到200级深度,OPTION(MAXRECURSION 0)如果你想为所有级别设置它,你可以使用它(尽管确保查询可以在完成之前完成).