0

階層内の任意のカテゴリに基づいて、Productテーブルからすべての製品を返したい。

たとえば、すべての「フォード」(カテゴリ= 1)で商品を検索すると、2つの結果が返されます。

現在、この再帰的な結果は、productテーブルとCategoryHierarchyテーブルが完全に一致する場合にのみ製品を返します。したがって、category=4と言えば機能します。

製品表には、2つのフォードマスタングがあります。価格と説明のみが異なりますが(ここには表示されていません)、製品カテゴリに関しては分類は同じです。

[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パラメーターのlowestcategoryが1OR2 OR 3 OR 4の場合、これらの同じ2つの結果が表示されます。現時点では、=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
4

1 に答える 1

2

Productの結合から再帰部分(CategoryHierarchyテーブルをトラバースする)を分離したいと思います。最も低い(または「最も高い」)カテゴリから始めて、さらに深く移動し、最後に製品のそのセットに参加します...次のようになります。

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 に答える