2013-05-05 12 views
5

Chcę ustawić dane w tabeli ze strukturą drzewa.Uzyskiwanie określonej ścieżki węzłów z katalogu root 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 

Jak mogę uzyskać ścieżkę węzła z katalogu głównego dla konkretnych węzłów?

Na przykład doprowadzić do Id IN (2, 5, 10) jest:

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 

Dla jednego identyfikatora używam tego kodu T-SQL, proszę wypełnić go:

;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 

Gdy używam FOR XML PATH('') prędkość jest niska, w jaki sposób można Bez tego używam twojego kodu T-SQL?

+0

nie moja odpowiedź w rozwiązaniu problemu? –

Odpowiedz

3

Jak o tym:

;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 

Wynik:

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 
Powiązane problemy