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