2011-12-27 19 views
4

私はリージョンとサブリージョンの階層テーブルを持っていますが、簡単にはリージョンとサブリージョンのツリーをリストする必要がありますまた、各地域ごとに、その地域のすべてのIDを表示する列が必要です。例えばカテゴリ/サブカテゴリのツリーを表示し、そのサブカテゴリを同じ行に表示する

: 、I領域の行のものを()検索関数を作成してそれを行っている

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 name  superiorId 
------------------------------- 
1  RJ   NULL   
2  Tijuca  1   
3  Leblon  1   
4  Gavea  2   
5  Humaita  2   
6  Barra  4 

Iのようなものであるとの結果を必要たとえば、ある国からすべての地域を選択すると、各地域の地域の息子を取得するための関数を実行するため、クエリは本当に遅くなります。

誰もが最適化された方法でそれを取得する方法を知っていますか?

「行としてすべてのIDを取得する」という機能がある:

I関数はカンマで区切られた文字列として全てのサブ領域の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番目の "RJ"は "TJ"とされていますか?あなたのサンプル出力の "RJ"は2〜6のサブリージョンを持っていますが、 "RJ"にも接続する7,8,9は含まれていません。データをクリーンアップして、おそらく助けることができます。 – mwigdahl

+2

申し訳ありません。私は編集時にそれを台無しにしてしまった...固定されている –

答えて

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オブジェクトをシリアライズするつもりであるので、その列を持つことは私にとっては素晴らしいことです。 –

+0

あなたはそれをCLR関数にしようとしましたか?あなたのドメインにどのようなプログラミング言語が使用されていますか? –

+1

CRL機能とはどういう意味ですか?私は各領域のすべてのsubRegionsを返す上記(getSubRegions)を作成しました。 私はColdfusionでプログラミングしています。アプリケーションはクエリを呼び出し、結果を処理して必要なJSONファイルを作成します。しかし、私はJavaを使うこともできます。 –

関連する問題