2013-05-25 5 views
29
ID  parent_id name 
--------------------- 
1  2   first 
2  4   second 
3  3   third 
4  5   fourth 
5  -   fifth 

lista przodkowie first powinny być (2, 4, 5)SQL kwerendy cyklicznej, która pobiera wszystkie przodków elementu

+1

Czy możesz pokazać swoje wysiłki do tej pory? z twoich danych nie rozumiem, jak "pierwszy" ma powiązanego rodzica 2,4 i 5 – georgealton

+0

Czy nie możesz po prostu dołączyć? – bestprogrammerintheworld

+0

W serwerze sql można to zrobić za pomocą CTE, zobacz http://stackoverflow.com/questions/3916597/sql-server-recursive-query dla podstawowego algorytmu –

Odpowiedz

63
with name_tree as (
    select id, parent_id, name 
    from the_unknown_table 
    where id = 1 -- this is the starting point you want in your recursion 
    union all 
    select c.id, c.parent_id, c.name 
    from the_unknown_table c 
    join name_tree p on p.parent_id = c.id -- this is the recursion 
) 
select * 
from name_tree 
where id <> 1; -- exclude the starting point from the overall result 

SQLFiddle: http://sqlfiddle.com/#!3/87d0c/1

+0

Bardzo śliski. Właściwie szukałem funkcji rekursywnej do wstawienia procedury przechowywanej, aby zrobić to samo. –

+0

@a_horse_with_no_name - Dobrze grany, sir. – Buggieboy

+1

To nie wydaje się działać - zwraca tylko pierwszy wiersz. czego mi brakuje? – Andrey

11

Można użyć coś takiego:

with parents as 
(
    select ID, parent_ID 
    from t 
    where parent_ID is not null 
    union all 
    select p.ID, t.parent_ID 
    from parents p 
    inner join t on p.parent_ID = t.ID 
     and t.parent_ID is not null 
     and t.ID <> t.parent_ID 
) 
select * 
    , parents = '(' + stuff 
    (
     (
     select ', ' + cast(p.parent_ID as varchar(100)) 
     from parents p 
     where t.ID = p.ID 
     for xml path('') 
    ), 1, 2, '' 
    ) + ')' 
from t 
order by ID 

SQL Fiddle with demo.

Łączy w sobie dwie bardzo popularne techniki T-SQL - użycie CTE do uzyskania hierarchii i użycia FOR XML PATH w celu uzyskania listy CSV.

+0

To działa dobrze – Andrey

+0

Dobra odpowiedź + wyjaśnienie, miło! –

Powiązane problemy