5

次のツリーがあるとします。

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

特定のレベルで特定のノードの祖先を見つけるスクリプトが必要です。

たとえば、レベル 2 のサラの祖先はピーターであり、レベル 0 のピーターの祖先はボブです。

階層 CTE を使用してこれを行う簡単な方法はありますか? sqlfiddle

4

3 に答える 3

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;

これにより、最上位の親で終わるSarah親子チェーンが.id = 5parentid = NULL

これが更新されたSQLフィドルです

于 2012-09-25T11:24:03.373 に答える
3
declare @fromid int, @level int
select @fromid = 5, @level = 2 -- for sarah's ancestor at level 2
select @fromid = 4, @level = 0 -- for peter's ancestor at level 0

;with cte as (    
    select * from tree where id = @fromId
    union all
    select t.Id, t.ParentId, t.Name, t.Level from cte
        inner join tree t on t.id = cte.ParentId
) 
    select * from cte
    where Level=@level
于 2012-09-25T11:24:16.260 に答える
0

これを試して:

DEclare @level int=0
Declare @name varchar(10)='Peter'
;WITH CTE as (
select * from tree where Name=@name
UNION ALL
select t.* from Tree t inner join CTE c on
t.ID=c.ParentId and t.Level >=@level)
select top 1 Name as Ancestor from CTE order by id
于 2012-09-25T11:34:39.433 に答える