2012-06-12 7 views
0

Я хочу вернуть все продукты из таблицы Product на основе любой категории в иерархии.SQL-рекурсивный результат для поиска всех продуктов в иерархии категорий

Например, вы можете искать товары у всех «Фордов» (категория = 1), и это вернет два результата.

Прямо сейчас этот рекурсивный результат возвращает продукты только в том случае, если в таблице продуктов есть точное соответствие таблице CategoryHierarchy. Так что это работает, если я скажу, что категория = 4.

В таблице продуктов у меня два Ford Mustang. Только цена и описание отличаются (не показаны здесь), но их классификация одинакова с точки зрения категорий продуктов.

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

Каждый Ford Mustang имеет иерархию категорий, которая идет 1,2,3,4. Те же два результата должны отображаться, если lowestcategory параметр Sql является 1 или 2 или 3 или 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 

ответ

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 
+0

Не повезло. Не возвращает никаких результатов для lowercategoryid = 1/2/или 3. – User970008

+0

Упс ... У меня был Id и ParentId в рекурсивной части cte. Попробуй. –

+0

Вы победитель. Ура! Спасибо! – User970008