2011-12-27 101 views
4

我有一個區域和子區域的分層表,我需要列出區域和子區域(這很容易)的樹,但另外,我需要一個列,顯示每個區域的所有子區域的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

回答

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

相關問題