2015-12-17 3 views
2

У меня есть таблица вроде этого:Как получить рекурсивные рекурсивные объекты с разделителями-запятыми?

Name   CategoryId ParentCategoryId 
Footwear  93   0 
Men Shoes  6    93 
Female Shoes 7    93 
Mobile   2    0 
Smartphone  4    2 

мне нужен выход, как:

Name   Categories 
Footwear  93,0  
Men Shoes  6,93,0  
Female Shoes 7,93,0  
Mobile   2,0 
Smartphone  4,2,0  

В принципе, мне нужно рекурсивно получить идентификаторы категории и превратить их в разделенных запятыми строку. Я получаю SQL через 3 года, и я не знаю, как получить этот результат. Я пробовал решения из других вопросов SO, но до сих пор не повезло.

ответ

3

Вы можете сделать это с рекурсивным КТРОМ:

DECLARE @t TABLE 
    (
     Name VARCHAR(100) , 
     CategoryId INT , 
     ParentCategoryId INT 
    ) 
INSERT INTO @t 
VALUES ('Footwear', 93, 0), 
     ('Men Shoes', 6, 93), 
     ('Female Shoes', 7, 93), 
     ('Mobile', 2, 0), 
     ('Smartphone', 4, 2); 

WITH cte 
      AS (SELECT * , 
         CAST(CategoryId AS VARCHAR(100)) AS Categories 
       FROM  @t 
       WHERE ParentCategoryId = 0 
       UNION ALL 
       SELECT t.* , 
         CAST(CAST(t.CategoryId AS VARCHAR(100)) + ',' 
         + c.Categories AS VARCHAR(100)) 
       FROM  @t t 
         JOIN cte c ON c.CategoryId = t.ParentCategoryId 
      ) 
    SELECT * 
    FROM cte 
+0

Спасибо. Это сработало для меня. Можете ли вы также рассказать мне, как я могу удалить последний идентификатор, который всегда равен 0 из столбца строки с разделителями-запятыми? – lbrahim

+0

@lbrahim, я отредактировал ответ. –

+0

Я проголосую за вас, вы были быстрее, и ваше решение лучше читать ... – Shnugo

1

Попробуйте с рекурсивным КТРОМ:

DECLARE @tbl TABLE(Name VARCHAR(100),CategoryId INT,ParentCategoryId INT); 
INSERT INTO @tbl VALUES 
('Footwear',93,0) 
,('Men Shoes',6,93) 
,('Female Shoes',7,93) 
,('Mobile',2,0) 
,('Smartphone',4,2); 

--based on this: http://stackoverflow.com/a/5522641/5089204 
WITH tree (CategoryId, ParentCategoryId, level, Name, rn, IdList) as 
(
    SELECT CategoryId, ParentCategoryId, 0 as level, Name, 
     convert(varchar(max),right(row_number() over (order by CategoryId),10)) AS rn, 
     convert(varchar(max),ISNULL(CategoryId,0)) AS IdList 
    FROM @tbl 
    WHERE ParentCategoryId = 0 

    UNION ALL 

    SELECT c2.CategoryId, c2.ParentCategoryId, tree.level + 1, c2.Name, 
     rn + '/' + convert(varchar(max),right(row_number() over (order by tree.CategoryId),10)), 
     convert(varchar(max),c2.CategoryId) + ',' + IdList 
    FROM @tbl c2 
    INNER JOIN tree ON tree.CategoryId = c2.ParentCategoryId 
) 
SELECT * 
FROM tree 
order by RN 

часть результата:

1 Mobile  2 
1/1 Smartphone 4,2 
2 Footwear  93 
2/1 Men Shoes  6,93 
2/2 Female Shoes 7,93 
Смежные вопросы