父子关系的公用表表达式与total

时间:2012-06-12 14:36:56

标签: sql sql-server common-table-expression

目前我对普通表格表达的了解很少,所以对此有任何帮助都非常感谢。

我有三个表[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

对此的任何帮助都会很棒!

1 个答案:

答案 0 :(得分: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)就在那里,因此它会迭代尽可能多的级别,因此您要么确保数据不会无限循环,要么限制递归级别。