2014-01-04 5 views
3

Я использую рекурсивный запрос для идентификации всех связанных дочерних категорий данного идентификатора категории.Рекурсивный SQL-запрос по убыванию

WITH parent AS (SELECT ParentId, Title, Id 
       FROM [CocoDb].[dbo].[Categories] 
       WHERE Id = @CategoryId),tree AS 
       ( 
        SELECT x.ParentId, x.Id, x.Title 
        FROM [CocoDb].[dbo].[Categories] x 
        INNER JOIN parent ON x.ParentId = parent.Id 
        UNION ALL 
        SELECT y.ParentId, y.Id, y.Title 
        FROM [CocoDb].[dbo].[Categories] y 
        INNER JOIN tree t ON y.ParentId = t.Id 
       ) 
SELECT * FROM Tree 

Моя таблица:

Categories (ID INT PRIMARY KEY, ParentId INT, Title VARCHAR(MAX)) 

Вопрос для SQL Server: может у меня есть запрос, который возвращает все категории?

В качестве примера:

  • Книги (ID: 1, Родитель: 0)
  • Ужасы (Id: 2, Родитель: 1)
  • Стивена Кинга (Id: 3, Родитель: 2)

И теперь, если я попрошу Стивена Кинга (Id 3), я получу все связанные категории, например, в этом случае Книги и Ужасы.

Возможно ли это с помощью рекурсивного SQL-запроса?

С наилучшими пожеланиями

ответ

2

Test Data

DECLARE @Categories TABLE(ID INT PRIMARY KEY, ParentId INT, Title VARCHAR(MAX)) 
INSERT INTO @Categories 
VALUES (1, 0, 'Books'),(2, 1, 'Horro'),(3, 2, 'Steven King') 
     ,(4, 3, 'Value 4'),(5, 4, 'Value 5') 

Запрос

;WITH ParentCte 
AS 
( 
    SELECT p.ID ,p.ParentId ,p.Title 
    FROM  @Categories p 
    WHERE p.Title = 'Steven King' 

    UNION ALL 

    SELECT c.ID ,c.ParentId,c.Title 
    FROM  ParentCte cte INNER JOIN @Categories c 
    ON c.ID = cte.ParentId 
) 
SELECT * 
FROM ParentCte m 

Результат Набор

╔════╦══════════╦═════════════╗ 
║ ID ║ ParentId ║ Title ║ 
╠════╬══════════╬═════════════╣ 
║ 3 ║  2 ║ Steven King ║ 
║ 2 ║  1 ║ Horro  ║ 
║ 1 ║  0 ║ Books  ║ 
╚════╩══════════╩═════════════╝ 
+0

Не проблема, рад, что это помогло :) –

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