【问题标题】:List category/subcategory tree and display its sub-categories in the same row列出类别/子类别树并在同一行显示其子类别
【发布时间】:2011-12-27 17:52:31
【问题描述】:

我有一个区域和子区域的层次表,我需要列出区域和子区域的树(这很容易),而且我需要一个列来显示每个区域的所有它的子区域的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

我通过创建一个检索区域行的 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

【问题讨论】:

  • 这不太合理。第二个“RJ”应该是“TJ”吗?为什么示例输出中的“RJ”具有 2 到 6 的子区域,但不包括也连接到“RJ”的 7、8 和 9?清理数据,也许我们可以提供帮助。
  • 对不起。我在编辑时搞砸了...它已修复

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


【解决方案1】:

当我们过去在数据库中制作这些串联列表时,我们采用了与您最初所做的类似的方法

然后当我们寻找速度时

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

【讨论】:

  • 我想不出一个快速的方法,即使在应用层,我想要的东西也需要一些时间来处理。拥有该专栏对我来说很棒,因为我将使用该信息序列化一个 json 对象。
  • 您是否尝试将其设为 CLR 函数?您的域使用什么编程语言?
  • CRL函数是什么意思?我在上面创建了一个(getSubRegions),它返回每个区域的所有子区域。我在 Coldfusion 编程。应用程序调用查询并处理它的结果以构建我需要的 JSON 文件。但我也可以使用 Java。
  • 我添加了一个关于 clr 函数的链接
猜你喜欢
  • 2012-10-14
  • 2013-10-27
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多