Перечислите дерево категорий / подкатегорий и отобразите его подкатегории в одной строке - PullRequest
4 голосов
/ 27 декабря 2011

У меня есть иерархическая таблица регионов и субрегионов, и мне нужно перечислить дерево регионов и субрегионов (что легко), но также мне нужен столбец, который отображает для каждого региона всеидентификаторы его субрегионов.

Например:

id  name        superiorId
-------------------------------
1       RJ          NULL        
2       Tijuca      1           
3       Leblon      1           
4       Gavea       2           
5       Humaita     2           
6       Barra       4   

Мне нужно, чтобы результат был примерно таким:

id      name        superiorId    sub-regions
-----------------------------------------
1       RJ          NULL        2,3,4,5,6
2       Tijuca      1           4,5,6
3       Leblon      1           null
4       Gavea       2           4
5       Humaita     2           null
6       Barra       4           null

Я сделал это, создав функциюэто возвращает STUFF () строки региона, но когда я, например, выбираю все регионы из страны, запрос становится очень, очень медленным, так как я выполняю функцию, чтобы получить сыновей региона для каждого региона.

Кто-нибудь знает, как получить это оптимизированным способом?

Функция, которая "извлекает все идентификаторы в виде строки":

Я имел в виду, что функция возвращает всеидентификаторы субрегиона в виде строки, разделенные запятой.Функция:

CREATE FUNCTION getSubRegions (@RegionId int)
RETURNS TABLE
AS
RETURN(
select stuff((SELECT CAST( wine_reg.wine_reg_id as varchar)+',' 
from (select wine_reg_id
            , wine_reg_name   
            , wine_region_superior
        from wine_region as t1
        where wine_region_superior = @RegionId
         or exists 
              ( select * 
                 from wine_region as t2
                   where wine_reg_id = t1.wine_region_superior 
                       and (
                          wine_region_superior = @RegionId 

                           ) 
              ) ) wine_reg
ORDER BY wine_reg.wine_reg_name ASC for XML path('')),1,0,'')as Sons)
GO

1 Ответ

2 голосов
/ 28 декабря 2011

Когда мы использовали для создания этих составных списков в базе данных, мы использовали подход, аналогичный тому, что вы делаете вначале

тогда, когда мы искали скорость

we made them into CLR functions
http://msdn.microsoft.com/en-US/library/a8s4s5dz(v=VS.90).aspx

и теперь наша база данных отвечает только за хранение и извлечение данных

this sort of thing will be in our data layer in the application
...