2014-02-27 77 views
0

我有兩個表如下查找頂級家長和遞歸CTE

Table Person 

    Id Name 
    1 A 
    2 B 
    3 C 
    4 D 
    5 E 

Table RelationHierarchy 

ParentId CHildId 
    2   1 
    3   2 
    4   3 

這將形成樹狀結構

 D 
     | 
     C 
     | 
     B 
     | 
     A 

我使用下面的CTE找到頂級父

DECLARE @childID INT 
    SET @childID = 1 --chield to search 

    ;WITH RCTE AS 
    (
    SELECT *, 1 AS Lvl FROM RelationHierarchy 
    WHERE ChildID = @childID 

    UNION ALL 

    SELECT rh.*, Lvl+1 AS Lvl FROM dbo.RelationHierarchy rh 
    INNER JOIN RCTE rc ON rh.CHildId = rc.ParentId 
    ) 
    SELECT TOP 1 id, Name 
    FROM RCTE r 
    inner JOIN dbo.Person p ON p.id = r.ParentId 
    ORDER BY lvl DESC 

現在的問題是,因爲人是他自己的頂層,那麼他的身份證應該返回,而不是沒有記錄秒。我是否需要臨時表或表變量來檢查CTE的計數,然後在計數爲零時返回 @childID?

+0

我添加了sql-server標記,因爲代碼看起來像SQL Server代碼。 –

+0

看來你需要將頂層添加到關係層次表(即parentID = childID) – Jayvee

+0

正如@Jayvee提到的,我相信你錯過了'ParentId NULL和ChildId 4'的記錄。這應該是你在RCTE的主播。 – NickyvV

回答

1

我認爲這解決了您的問題。這個想法是強迫孩子的開始,而不是最初做一個查詢:

WITH RCTE AS 
    (
    SELECT @childID as parentId, NULL as childid, 1 AS Lvl 

    UNION ALL 

    SELECT rh.*, Lvl+1 AS Lvl FROM dbo.RelationHierarchy rh 
    INNER JOIN RCTE rc ON rh.CHildId = rc.ParentId 
    ) 
    SELECT TOP 1 id, Name 
    FROM RCTE r 
    inner JOIN dbo.Person p ON p.id = r.ParentId 
    ORDER BY lvl DESC; 
+0

工作正常。非常感謝 – InTheWorldOfCodingApplications