0

我目前缺乏对常用表表达式的了解,因此非常感谢您对此的任何帮助。

我有三个表[Category],它们定义了 Product[Product][Mapping]Category 之间的关系(一对多)。每个类别都有一个 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 回答