2012-04-13 98 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的单位ID,它会使单位ID等于2给我。它需要成为SecondUnit One。或者如果我选择等于7的单位ID,它会将单位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 2012-04-13 07:38:59

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子句的第二部分。