2012-04-13 1 views
4

Я использую SQL Server 2008. У меня есть таблица вроде этого:Как получить второй родитель с рекурсивным запросом в общей таблице

UnitId ParentId UnitName 
--------------------------- 
1  0  FirstUnit 
2  1  SecondUnit One 
3  1  SecondUnit Two 
4  3   B 
5  2   C 
6  4   D 
7  6   E 
8  5   F 

Я хочу, чтобы второй родитель записи. Например:

Если я выберу идентификатор модуля, равный 8, он приведет к тому, что идентификатор единицы равен мне 2. Он должен быть SecondUnit One. или Если я выберу идентификатор единицы, равный 7, он будет приносить единицу id равным мне 3. Это должно быть SecondUnit Two.

Как я могу написать SQL-запрос таким образом?

ответ

6

Это мне потребовалось некоторое время, но здесь это :)

with tmp as (
    select unitId, parentId, unitName, 0 as iteration 
    from t 
    where unitId = 7 
    union all 
    select parent.unitId, parent.parentId, parent.unitName, child.iteration + 1 
    from tmp child 
    join t parent on child.parentId = parent.unitId 
    where parent.parentId != 0 
) 
select top 1 unitId, parentId, unitName from tmp 
order by iteration desc 

Здесь также fiddle играть.

+2

спасибо. Оно работает. Отличное решение. – sinanakyazici

1
SELECT t.*, tParent1.UnitId [FirstParent], tParent2.UnitId [SecondParent] 
FROM Table t 
    LEFT JOIN Table tParent1 ON t.ParentId = tParent1.UnitId 
    LEFT JOIN Table tParent2 ON tParent1.ParentId = tParent2.UnitId 
WHERE t.UnitId = <Unit ID search here> 
    AND NOT tParent2.UnitId IS NULL 

Редактировать: И оставить вторую часть предложения WHERE, если вы хотите, чтобы результаты возвращались, даже если у них нет второго родителя.

Смежные вопросы