使用parentId SQL获取所有级别的行

时间:2015-05-28 13:12:38

标签: sql-server-2012 rows levels

我有一个表Categories,此表中的每一行都有一个parentId。父级只是同一个表中的另一行。

我想通过提供第一个父级的Id来创建查询以使所有孩子处于不同级别。

1 个答案:

答案 0 :(得分:1)

使用递归cte:

DECLARE @t TABLE ( id INT, pid INT )
INSERT  INTO @t
VALUES  ( 1, NULL ),
        ( 2, NULL ),
        ( 3, 1 ),
        ( 4, 1 ),
        ( 5, 3 ),
        ( 6, 5 ),
        ( 7, 6 ),
        ( 8, 6 )

DECLARE @p INT = 1;

WITH    cte
          AS ( SELECT   *
               FROM     @t
               WHERE    pid = @p
               UNION ALL
               SELECT   t.*
               FROM     @t t
                        JOIN cte c ON c.id = t.pid
             )
    SELECT  *
    FROM    cte c

输出:

id  pid
3   1
4   1
5   3
6   5
7   6
8   6

修改

在另一个select statement中使用:

WITH    cte
      AS ( SELECT   *
           FROM     @t
           WHERE    pid = @p
           UNION ALL
           SELECT   t.*
           FROM     @t t
                    JOIN cte c ON c.id = t.pid
         )
SELECT  *
FROM    cte c
JOIN AnotherTable t on c.id = t.id