Нужна помощь с запросом SQL (SQL Server 2005) для преобразования этих данных - PullRequest
0 голосов
/ 22 июля 2009

Вот упрощенный взгляд на стол, который у меня есть

Категория

  • CategoryId
  • CategoryName
  • ParentCategoryId

Как вы можете видеть, таблица каталога является таблицей с самореференциями, поэтому ее повторение возможно, начиная с 0, который является фиктивной «корневой» категорией (также может быть нулевым, но это не так).

Пример данных:

1, Apples, 0
5, Yummy, 1
10, Really Yummy, 5
15, Yucky, 0
18, Some Sub Cat, 15
20, Some Deep Sub Cat, 18
25, Some Deep Sub Cat 2, 18

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

CatId, [up to 4 deep of category names on the hierarchy in separate columns, or null if none]
1, Apples, NULL, NULL, NULL
5, Apples, Yummy, NULL, NULL
10, Apples, Yummy, Really Yummy, NULL
15, Apples, Yucky, NULL, NULL
18, Apples, Yucky, Some Sub Cat, NULL
20, Apples, Yucky, Some Sub Cat, Some Deep Sub Cat
25, Apples, Yucky, Some Sub Cat, Some Deep Sub Cat 2

Этот SQL близок, но генерирует его задом наперед, выровненный влево

select c1.categoryid, c1.name, c2.name, c3.name, c4.name
from category c1
    left outer join category c2
        on c1.parentcategoryid = c2.categoryid
    left outer join category c3
        on c2.parentcategoryid = c3.categoryid
    left outer join category c4
        on c3.parentcategoryid = c4.categoryid

У каких-нибудь гениев SQL есть хорошие идеи?

1 Ответ

1 голос
/ 22 июля 2009
select c1.CategoryId as id,
       c1.CategoryName as n1,
       c2.CategoryName as n2,
       c3.CategoryName as n3,
       c4.CategoryName as n4
from            Category c1
left outer join Category c2 on c2.ParentCategoryId = c1.CategoryId
left outer join Category c3 on c3.ParentCategoryId = c2.CategoryId
left outer join Category c4 on c4.ParentCategoryId = c3.CategoryId
where c1.parentcategoryid = 0;

(согласно вашему редактированию: вы только что перевернули ParentCategoryId и CategoryID в объединениях.)

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