2012-06-12 2 views
0

계층의 모든 범주를 기반으로 Product 테이블에서 모든 제품을 반환하려고합니다.범주 계층 구조 내의 모든 제품을 찾기위한 SQL 재귀 결과

예를 들어 "Fords"(카테고리 = 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 

각 포드 머스탱에는 1,2,3,4가되는 CategoryHierarchy가 있습니다. 이 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 = 경우 SQL 매개 변수의 lowestcategory는 지금 1 또는 2 또는 3 또는 4 인 경우 그 같은 두 가지 결과를 표시해야 만 작동합니다

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

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

운. lowestcategoryid = 1/2/또는 3에 대한 결과를 반환하지 않습니다. – User970008

+0

죄송합니다 ... ID 및 ParentId가 cte의 재귀 부분을 전환했습니다. 지금 시도해보십시오. –

+0

당신이 승자입니다. 예! 고맙습니다! – User970008