2009-03-31 1 views
0

下記のとおり、私は(簡単のために)のテーブルを持っている:このSQL Server階層を簡単に継承された包括的なリストに平坦化できますか?

Category 
-------------------- 
CategoryId (0 for root nodes) 
ParentCategoryId 

ProductCategory 
-------------------- 
ProductId 
CategoryId 

私はすべてのカテゴリとその継承された製品(バックカテゴリ0のすべての方法)の個別のリストを取得できるようにしたいと思います。カテゴリ0にはすべての製品が含まれている必要があり、他のすべてのカテゴリは階層の下を無限に深く追うべきです。

例表の内容:

CategoryId, ParentCategoryId 
--------------------- 
1, 0 
2, 0 
3, 0 
10, 1 
20, 2 

ProductId, CategoryId 
--------------------- 
1, 10 
2, 1 
3, 2 
4, 20 
5, 3 

私は出力が階層構造を旅し、私の製品が該当することができ、すべてのカテゴリをお伝えしたいと思います。したがって、望ましい結果は次のようになります。

ProductId, CategoryId 
--------------------- 
1, 0 
2, 0 
3, 0 
4, 0 
5, 0 
1, 1 
2, 1 
3, 2 
4, 2 
5, 3 
1, 10 
4, 20 

SQL Server 2005でこれを行う簡単な方法はありますか?

答えて

4

これは、再帰的な共通テーブル式(cte)で実行できます。 http://msdn.microsoft.com/en-us/library/ms186243.aspx

WITH X (ProductId, CategoryId) AS (
    SELECT ProductId, CategoryId FROM #ProductCategory 
    UNION ALL 
    SELECT X.ProductId, C.ParentCategoryId FROM X 
    INNER JOIN #Category C ON X.CategoryId = C.CategoryId 
) 
SELECT ProductId, CategoryId FROM X ORDER BY CategoryId, ProductId 

詳しい情報

関連する問題