递归SQL问题

时间:2011-02-12 00:36:50

标签: sql parent categories

我需要找到当前级别或以下具有项目的所有类别,或者包含具有项目的子类别。 类别具有CategoryID,ParentCategoryID。 项目具有CategoryID。

我使用存储过程获得了大部分解决方案:

AS   
WITH get_cat_hier   
AS  
(  

Select e.CategoryID, e.ParentCategoryID, From Categories AS e  
    where e.ParentCategoryId = @ParentCategoryId   
    union ALL  
    Select e.CategoryID, e.ParentCategoryID, From Categories e  
    inner join get_cat_hier AS ecte on ecte.CategoryID = e.ParentCategoryID  
        )  

select DISTINCT e.CategoryID from Categories as e   
 inner join items as item on (item.CategoryID = e.CategoryID) -- *******Problem*****  
where   
  (e.CategoryID in (select CategoryID FROM get_cat_hier AS CategoryID)

)  

不幸的是,这只返回带有项目的类别,而不返回带有项目的子类别的类别。我需要以某种方式用递归调用替换“item.CategoryID = e.CategoryID”。

3 个答案:

答案 0 :(得分:2)

我不确定这是一个新的解决方案还是正在开发的解决方案。如果使用嵌套集来表示层次结构,则可以更轻松地执行此类报告。 Joe Celko有一些关于这个主题的精彩文章。

多年前我确实要求跟踪系统,其中有一个深层次的指挥链。报告必须针对个人及其所有下属。

您应该考虑使用嵌套集而不使用父指针系统。

http://en.wikipedia.org/wiki/Nested_set_model

答案 1 :(得分:0)

  1. 取出你的where子句(我认为不需要)
  2. 保留您的商品加入,然后加入商品表和类别表之间的get_cat_heir。

答案 2 :(得分:0)

我认为这是导致错误结果集的CTE的锚定成员。

其WHERE子句实际上应该是where e.CategoryId = @ParentCategoryId