Как получить уровень иерархии этого запроса - PullRequest
0 голосов
/ 15 декабря 2011

Я пытаюсь получить уровень иерархии этого запроса.Вот рекурсивный запрос CTE

WITH CategoryRec AS 
(
    SELECT Id, Parentid, Name
    FROM dbo.Category

    UNION ALL

    SELECT cr.Id, c.Parentid, cr.Name
    FROM CategoryRec AS cr INNER JOIN dbo.Category AS c ON cr.Parentid = c.Id
    WHERE c.Parentid IS NOT NULL
)
SELECT DISTINCT Id, Parentid, Name
FROM  CategoryRec

Этот вопрос связан с этим вопросом здесь: Как получить полную иерархию с помощью SQL CTE

Спасибо за вашу помощь

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

Вы должны выбрать верхний уровень вашей иерархии в первом запросе с уровнем, как написал marc_s.

;WITH CategoryRec AS 
(
  SELECT a.Id, 
         a.Parentid, 
         a.Name, 
         1 AS 'Level'
    FROM dbo.Category as a
   WHERE a.Parentid IS NULL

  UNION ALL

  SELECT b.Id, 
         b.Parentid, 
         b.Name, 
         a.Level + 1 
    FROM CategoryRec  as a
           INNER JOIN 
         dbo.Category as b on b.Parentid = a.Id
   WHERE b.Parentid IS NOT NULL
)
SELECT Id, Parentid, Name, Level
FROM  CategoryRec
2 голосов
/ 15 декабря 2011

Вам необходимо добавить столбец с именем Level (или как вы хотите его называть) - как в «якорный» SELECT, так и в рекурсивную часть вашего CTE - как это:

WITH CategoryRec AS 
(
    SELECT Id, Parentid, Name, 1 AS 'Level'
    FROM dbo.Category

    UNION ALL

    SELECT cr.Id, c.Parentid, cr.Name, cr.Level + 1 
    FROM CategoryRec AS cr 
    INNER JOIN dbo.Category AS c ON cr.Parentid = c.Id
    WHERE c.Parentid IS NOT NULL
)
SELECT DISTINCT Id, Parentid, Name, Level
FROM  CategoryRec
0 голосов
/ 16 декабря 2011

Возвращает правильные уровни.Но не уверен, что этот запрос является производительным, это должно быть

WITH CategoryRec AS 
(
    SELECT     Id, Parentid, Name, 1 as [Level]
    FROM dbo.Category
    where Parentid IS NULL

    UNION ALL

    SELECT c.Id, c.Parentid, c.Name, (cr.[Level] + 1) as [Level]
    FROM Category c INNER JOIN
    CategoryRec AS cr ON c.Parentid = cr.Id
),
CategoryRec2 as
(
    SELECT Id, Parentid, Name, [Level]
    FROM CategoryRec

    UNION ALL

    SELECT cr.Id, c.Parentid, cr.Name, cr.[Level]
    FROM CategoryRec2 AS cr INNER JOIN
    CategoryRec AS c ON cr.Parentid = c.Id
    WHERE c.Parentid IS NOT NULL
)
SELECT Id, Parentid, Name, [Level]
FROM CategoryRec2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...