SQL - 多级自联接

时间:2016-12-29 06:13:13

标签: sql join sql-server-2008-r2 self-join

我有一个像这样的父子关系的表 - Isfinal列表明它是该级别的最后一个元素

ID    name    ParentId    Isfinal
1     abc       0           No
2     acd       1           No
3     ads       1           No
4     xyz       2           No
5     xxy       2           Yes
6     plm       3           No
7     ytr       4           Yes
8     lks       6           Yes

我正在尝试编写一个动态查询,它将为该元素提供该ID。

E.G。

如果我选择2,则应将结果显示为 -

ID    name    ParentId    Isfinal
4     xyz       2           No
5     xxy       2           Yes
7     ytr       4           Yes

自我加入是否可能?

1 个答案:

答案 0 :(得分:3)

使用递归CTE,您可以解决此问题。

DECLARE @TABLE  TABLE
(   ID          int
    ,name       nvarchar(200)
    ,ParentId   int
    ,Isfinal    nvarchar(20)
)

INSERT INTO @TABLE
VALUES (1,'abc',0,'No'),(2,'acd',1,'No'),(3,'ads',1,'No'),
        (4,'xyz',2,'No'),(5,'xxy',2,'Yes'),(6,'plm',3,'No'),
        (7,'ytr',4,'Yes'),(8,'lks',6,'Yes')

DECLARE @ID INT = 2

;WITH CTE
AS
(
    SELECT  ID,name,ParentId,Isfinal
    FROM    @TABLE
    WHERE   ParentId    =   @ID

    UNION ALL

    SELECT  T.ID,T.name,T.ParentId,T.Isfinal
    FROM    @TABLE  T
        INNER JOIN  CTE C   ON  C.ID    =   T.ParentId
)

SELECT * FROM CTE