SQL Tree在特定级别查找anscestors

wog*_*les 5 sql t-sql sql-server sql-server-2008

说我有以下树:

CREATE TABLE Tree(Id int, ParentId int, Name varchar(20), Level int)

INSERT INTO Tree(Id, ParentId, Name, Level)
SELECT 1, NULL, 'Bob', 0 UNION ALL 
SELECT 2, 1, 'John', 1 UNION ALL
SELECT 3, 1, 'Bill', 1 UNION ALL
SELECT 4, 3, 'Peter', 2 UNION ALL
SELECT 5, 4, 'Sarah', 3
Run Code Online (Sandbox Code Playgroud)

我需要一个脚本来查找特定级别的给定节点的祖先:

例如,第2级Sarah的祖先是Peter,而0级的Peter的祖先是Bob.

使用分层CTE有一种简单的方法吗?sqlfiddle

Mah*_*mal 4

你可以这样做:

;WITH TreeCTE
AS
(
    SELECT Id, ParentId, Name, Level
    FROM Tree
    WHERE Id = 5
    UNION ALL 
    SELECT t.Id, t.ParentId, t.Name, t.Level
    FROM TreeCTE AS c
    INNER JOIN Tree t ON c.ParentId = t.Id  
)
SELECT * FROM TreeCTE;
Run Code Online (Sandbox Code Playgroud)

这将为您提供父子链,从最顶层的父级开始Sarahid = 5parentid = NULL.

这是更新的 sql 小提琴