Как я могу легко сгладить эту иерархию Sql Server в унаследованном инклюзивном списке? - PullRequest
0 голосов
/ 31 марта 2009

У меня есть таблицы (для простоты), как указано ниже:

Category
--------------------
CategoryId (0 for root nodes)
ParentCategoryId

ProductCategory
--------------------
ProductId
CategoryId

Я бы хотел получить отдельный список всех категорий и их унаследованных продуктов (вплоть до категории 0). Категория 0 должна включать ВСЕ продукты, а все другие категории должны следовать иерархии настолько бесконечно, насколько это возможно.

Пример таблицы содержимого:

CategoryId, ParentCategoryId
---------------------
1, 0
2, 0
3, 0
10, 1
20, 2

ProductId, CategoryId
---------------------
1, 10
2, 1
3, 2
4, 20
5, 3

Я бы хотел, чтобы выходные данные поднимались вверх по иерархии и сообщали мне о каждой категории, к которой относится продукт. Таким образом, желаемый результат будет выглядеть примерно так:

ProductId, CategoryId
---------------------
1, 0
2, 0
3, 0
4, 0
5, 0
1, 1
2, 1
3, 2
4, 2
5, 3
1, 10
4, 20

Есть ли простой способ сделать это в SQL Server 2005?

1 Ответ

4 голосов
/ 31 марта 2009

Вы можете сделать это с помощью рекурсивного общего табличного выражения (cte).

WITH X (ProductId, CategoryId) AS (
    SELECT ProductId, CategoryId FROM #ProductCategory
    UNION ALL
    SELECT X.ProductId, C.ParentCategoryId FROM X
    INNER JOIN #Category C ON X.CategoryId = C.CategoryId
)
SELECT ProductId, CategoryId FROM X ORDER BY CategoryId, ProductId

Больше информации на http://msdn.microsoft.com/en-us/library/ms186243.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...