我想根据层次结构中的任何类别返回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
答案 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