2013-05-05 41 views
5

我想要在树结构中设置表中的数据。从根tsql获取特定的节点路径

DECLARE @temp TABLE 
(
     Id INT 
    , Name VARCHAR(50) 
    , Parent INT 
) 

INSERT @temp 
SELECT 1,' Great GrandFather Thomas Bishop', null UNION ALL 
SELECT 2,'Grand Mom Elian Thomas Wilson' , 1 UNION ALL 
SELECT 3, 'Dad James Wilson',2 UNION ALL 
SELECT 4, 'Uncle Michael Wilson', 2 UNION ALL 
SELECT 5, 'Aunt Nancy Manor', 2 UNION ALL 
SELECT 6, 'Grand Uncle Michael Bishop', 1 UNION ALL 
SELECT 7, 'Brother David James Wilson',3 UNION ALL 
SELECT 8, 'Sister Michelle Clark', 3 UNION ALL 
SELECT 9, 'Brother Robert James Wilson', 3 UNION ALL 
SELECT 10, 'Me Steve James Wilson', 3 

如何从特定节点的根节点获取路径节点?

例如导致了Id IN (2, 5, 10)是:

Id Result 
2 Great GrandFather Thomas Bishop -> Grand Mom Elian Thomas Wilson 
5 Great GrandFather Thomas Bishop -> Grand Mom Elian Thomas Wilson -> Aunt Nancy Manor 
10 Great GrandFather Thomas Bishop -> Grand Mom Elian Thomas Wilson -> Dad James Wilson -> Me Steve James Wilson 

对于一个ID我用这个T-SQL代码,请完成它:

;WITH cte AS 
(
    SELECT *, t = 1 
    FROM @temp 
    WHERE Id = 10 -- <-- your id 

    UNION ALL 

    SELECT t2.*, t + 1 
    FROM cte t 
    JOIN @temp t2 ON t.Parent = t2.Id 
) 
SELECT STUFF((
    SELECT ' -> ' + Name 
    FROM cte 
    ORDER BY t DESC 
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 4, '') 
Go 

当我使用FOR XML PATH('')速度低,怎么能我没有使用你的T-SQL代码?

+0

没有我的回答解决问题了吗? – 2013-05-13 09:20:08

回答

3

如何:

;WITH cte AS 
(
    SELECT *, t = 1, cast(name as varchar(max)) n2, id grp 
    FROM @temp 
    WHERE Id in (2,5,10) -- <-- your id 

    UNION ALL 

    SELECT t2.*, t + 1, coalesce(t2.name + ' -> ' + t.n2, t.n2), t.grp 
    FROM cte t 
    JOIN @temp t2 ON t.Parent = t2.Id 
), cte2 as 
(
SELECT grp, n2 result, row_number() over (partition by grp order by t desc) rn from cte 

) 
SELECT grp id, result from cte2 WHERE rn = 1 

结果:

id result 
2 Great GrandFather Thomas Bishop -> Grand Mom Elian Thomas Wilson 
5 Great GrandFather Thomas Bishop -> Grand Mom Elian Thomas Wilson -> Aunt Nancy Manor 
10 Great GrandFather Thomas Bishop -> Grand Mom Elian Thomas Wilson -> Dad James Wilson -> Me Steve James Wilson