2014-02-27 91 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