2015-05-28 3 views
0

У меня есть таблица Categories, и каждая строка в этих таблицах имеет parentId. Родитель - это просто другая строка в одной таблице.Получить строки на всех уровнях с parentId SQL

Я хочу создать запрос, чтобы получить всех детей на разных уровнях, просто давая Id первого родителя.

+0

Любые попытки решить это сами? Образцы данных? Структура таблицы? – Arion

ответ

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 

EDIT:

Для использования в другом 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 
+0

, если вы используете 3 в качестве ParentId, вам нужно получить только строку с Id = 5? !! –

+0

Нет, у 5 есть собственные дети 6 и 6 есть дети 7, 8. Не хотите ли вы детей с листьями? –

+0

@KernelMed, вы хотите, чтобы все непосредственные дети или все листовые дети? –

Смежные вопросы