0

現時点では、一般的なテーブル式に関する知識が不足しているため、これに関するヘルプは大歓迎です。

製品とカテゴリ (1 対多) の間の関係を定義する3 つのテーブル[Category][Product]あります。[Mapping]各カテゴリには、その親カテゴリを指定する ParentId があります。

私が達成したいのは、Category テーブルの各行と、それに割り当てられた製品の数とそのすべての子を含むリストです。

たとえば、(カテゴリテーブルデータ)

Category ID 1 (ParentID 0) has 1 product
Category ID 2 (ParentID 1) has 2 products
Category ID 3 (ParentID 2) has 3 products

私が求めている結果は、このようなものです...

ID     ParentID     Products
1      0            6
2      1            5
3      2            3

繰り返しますが、これに関するヘルプは素晴らしいでしょう!

4

1 に答える 1

2

SQL Server 2005 以降を使用していると仮定して (CTE について話しているため)、次のクエリを試してください。

WITH CTE1 AS
(
    SELECT A.ID, A.ParentID, COUNT(*) Products
    FROM Category A
    INNER JOIN Mapping B
    ON A.ID = B.CategoryID
    GROUP BY A.ID, A.ParentID
), CTE2 AS 
(
    SELECT *
    FROM CTE1
    UNION ALL
    SELECT B.ID, B.ParentID, A.Products
    FROM CTE2 A
    INNER JOIN CTE1 B
    ON A.ParentID = B.ID
)
SELECT ID, ParentID, SUM(Products) Products
FROM CTE2
GROUP BY ID, ParentID
OPTION(MAXRECURSION 0)

このsql fiddleで例を見ることができます。可能な限り多くのOPTION(MAXRECURSION 0)レベルを反復するため、データが無限にループしないようにするか、再帰のレベルを制限します。

于 2012-06-12T15:08:52.867 に答える