查找类别层次结构中所有产品的SQL递归结果

时间:2012-06-12 19:11:32

标签: sql recursion

我想根据层次结构中的任何类别返回Product表中的所有产品。

例如,您可以按所有“福特”(类别= 1)搜索产品,它会返回两个结果。

现在,只有在product表与CategoryHierarchy表中存在完全匹配时,此递归结果才会返回产品。所以如果我说category = 4就可以了。

在产品表中,我有两辆福特野马。只有价格和描述不同(此处未显示),但它们的分类在产品类别方面是相同的。

[Product Table]
[ProductId] [ProductName] [CategoryId]
1       Ford Mustang 1     4
2       Ford Mustang 2     4
3       Buick Regal 3      12

每辆福特野马的CategoryHierarchy都是1,2,3,4。如果Sql参数lowestcategory为1 OR 2 OR 3 OR 4,则应显示相同的两个结果。此时,它仅在= 4时才有效。

[CategoryHierarchy]
[Id]    [parentId]  [categoryName]
1       0           Ford
2       1           Mustang
3       2           2010
4       3           Blue
10      0           Buick
11      10          Regal
12      11          1999

MS SQL 2008:

declare @lowestcategoryid int;

set @lowestcategoryid = 4;--returns the products but I need it to work if this var = 1,2,3 too

--recursive loop
with RecursiveResult( id, CategoryName, ProductName, parentId) as
(
select ch.Id, ch.categoryname, p.productname, ch.parentId
from CategoryHierarchy ch 
join product p on p.categoryId = ch.id
where ch.id = @lowestcategoryid

UNION ALL

select p.categoryId, ch.categoryName, p.productname, ch.parentId
from product p
join CategoryHierarchy ch on p.categoryId = ch.id
join RecursiveResult r on ch.parentId = r.Id 

)

select * from recursiveresult

1 个答案:

答案 0 :(得分:2)

我认为您想要从Product上的连接中分离出递归部分(遍历CategoryHierarchy表)。从最低(或“最高”)类别开始并进一步深入,最后在Product上加入该集合......就像这样:

DECLARE @lowestcategoryid INT;

SET @lowestcategoryid = 3;

--recursive loop
WITH RecursiveResult( id, CategoryName, parentId) AS
(
SELECT ch.Id, ch.categoryname, ch.parentId
FROM CategoryHierarchy ch 
WHERE ch.id = @lowestcategoryid

UNION ALL

SELECT ch.Id, ch.categoryname, ch.parentId
FROM CategoryHierarchy ch 
    JOIN RecursiveResult r 
        ON r.Id = ch.ParentId

)

SELECT * 
FROM recursiveresult r
    JOIN Product p
        ON p.CategoryId = r.Id