【发布时间】: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