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

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

问题描述:

我有一个区域和子区域的分层表,我需要列出区域和子区域(这很容易)的树,但另外,我需要一个列,显示每个区域的所有子区域的ID。列出类别/子类别树并在同一行中显示其子类别

例如:

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 

我这样做,是通过创建检索区域行的东西()的函数, 但是当我从一个国家选择所有区域时,例如,查询变得非常慢,因为我执行函数来获取每个区域的区域儿子。

有谁知道如何以优化的方式获得?

说,“检索所有的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 
+0

这不太合理。第二个“RJ”应该是“TJ”吗?为什么样本输出中的“RJ”具有2到6的子区域,但不包括也连接到“RJ”的7,8和9?清理数据,也许我们可以提供帮助。 – mwigdahl 2011-12-27 19:31:24

+2

对不起。编辑时我搞砸了......这是固定的 – 2011-12-28 12:27:37

当我们使用的数据库,以使这些连接的列表中,我们采取了类似的方法来你在第一

在做那么当我们寻找速度

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 
+0

我无法想象一种快速实现这一点的方法,即使在应用程序层,我想要的东西需要一些时间来处理。 有了这个列对我来说会很棒,因为我要用这些信息序列化一个json对象。 – 2011-12-28 12:21:09

+0

您是否尝试使其成为CLR功能?你的域名使用什么编程语言? – 2011-12-28 13:27:47

+1

你是什么意思的CRL功能?我创建了上面的一个(getSubRegions),它返回每个区域的所有子区域。 我在Coldfusion编程。应用程序调用查询并处理结果以构建我需要的JSON文件。但我也可以使用Java。 – 2011-12-28 16:09:20