目前我对普通表格表达的了解很少,所以对此有任何帮助都非常感谢。
我有三个表[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
对此的任何帮助都会很棒!
答案 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)
就在那里,因此它会迭代尽可能多的级别,因此您要么确保数据不会无限循环,要么限制递归级别。