0

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

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

现在,只有当产品表中存在与 CategoryHierarchy 表完全匹配的情况下,此递归结果才会返回产品。因此,如果我说类别 = 4,它会起作用。

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

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

每辆福特野马都有 1,2,3,4 的 CategoryHierarchy。如果 Sql 参数 minimumcategory 为 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

微软 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
4

1 回答 1

2

我认为您想将递归部分(遍历 CategoryHierarchy 表)与 Product 的连接分开。从最低(或“最高”)类别开始并深入,最后加入 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
于 2012-06-12T19:24:14.297 回答