Предполагая, что глубина дерева категорий составляет не более 3 уровней, это должно работать:
declare @Catergory table (
ID int not null,
Name nvarchar(10) not null,
ParentID int null
)
declare @Customer table (
ID int not null,
Name nvarchar(10) not null,
SurName nvarchar(10) not null,
Address nvarchar(30) not null,
CategoryId int not null
)
insert into @Catergory (ID, Name, ParentID)
values (1, 'A', null), (2, 'B', null),
(3, 'C', null), (4, 'AA', 1),
(5, 'CC', 3), (6, 'AAA', 4),
(7, 'BB', 2), (8, 'AAA', 4),
(9, 'CCC', 5), (10, 'AA', 1)
insert into @Customer (ID, Name, SurName, Address, CategoryId)
values (1, 'Duck', 'Duffy', '10 Steet', 10),
(2, 'Ben', 'Ten', '10 Steet', 6),
(3, 'Cat', 'Dog', '10 Steet', 5),
(4, 'Chicken', 'Wings', '10 Steet', 1),
(5, 'Fish', 'Water', '10 Steet', 7)
-- build structure using assumption that the depth is max three levels
select *
from @Customer cust
join (
select ID, Name as CategoryName, null As CategoryType, null as SubCategory from @Catergory roots where ParentID is null
union
select mids.ID, roots.Name, mids.Name, null from @Catergory mids
join @Catergory roots on mids.ParentID = roots.ID and roots.ParentID is null
union
select leafs.ID, roots.Name, mids.Name, leafs.Name from @Catergory leafs
join @Catergory mids on leafs.ParentID = mids.ID
join @Catergory roots on mids.ParentID = roots.ID and roots.ParentID is null
) as struct on cust.CategoryId = struct.ID
order by cust.id
Выход:
+----+---------+---------+----------+------------+----+--------------+--------------+-------------+
| ID | Name | SurName | Address | CategoryId | ID | CategoryName | CategoryType | SubCategory |
+----+---------+---------+----------+------------+----+--------------+--------------+-------------+
| 1 | Duck | Duffy | 10 Steet | 10 | 10 | A | AA | NULL |
| 2 | Ben | Ten | 10 Steet | 6 | 6 | A | AA | AAA |
| 3 | Cat | Dog | 10 Steet | 5 | 5 | C | CC | NULL |
| 4 | Chicken | Wings | 10 Steet | 1 | 1 | A | NULL | NULL |
| 5 | Fish | Water | 10 Steet | 7 | 7 | B | BB | NULL |
+----+---------+---------+----------+------------+----+--------------+--------------+-------------+
Некоторые дополнительные колонны все еще там, но я вы можете избавиться от них. Обратите внимание, что некоторые столбцы картофеля имеют значения null
. Это связано с тем, что, если клиент находится в верхней или средней категории, нет разумного способа заполнить эти столбцы.
опубликуйте текущую попытку и ожидаемый результат. – ADyson
Возможный дубликат [CTE Recursion для получения иерархии дерева] (http://stackoverflow.com/questions/18106947/cte-recursion-to-get-tree-hierarchy) – iamdave
Почему вы не используете 'hierarchyid'? Установлено ли количество уровней? Если это так, вам не нужна рекурсия или CTE, только 3 сам присоединяется. Код будет проще и производительность намного быстрее, чем CTE –