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