列出类别/子类别树并在同一行中显示其子类别

时间:2011-12-27 17:52:31

标签: sql sql-server-2008 tsql tree hierarchy

我有一个区域和子区域的分层表,我需要列出一个区域和子区域的树(这很容易),但是,我需要一个列,显示每个区域的所有它的子区域的ids。

例如:

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()的函数来做到这一点, 但是当我从一个国家/地区选择所有地区时,查询变得非常非常慢,因为我执行该功能以获得每个地区的区域儿子。

有人知道如何以优化的方式获得它吗?

“将所有ID检索为行”的函数是:

我的意思是该函数将所有子区域的id作为字符串返回,以逗号分隔。 功能是:

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 个答案:

答案 0 :(得分:2)

当我们习惯在数据库中创建这些连接列表时,我们采用了与您最初所做的相似的方法

然后我们寻找速度

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