我需要找到当前级别或以下具有项目的所有类别,或者包含具有项目的子类别。 类别具有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
”。
答案 0 :(得分:2)
我不确定这是一个新的解决方案还是正在开发的解决方案。如果使用嵌套集来表示层次结构,则可以更轻松地执行此类报告。 Joe Celko有一些关于这个主题的精彩文章。
多年前我确实要求跟踪系统,其中有一个深层次的指挥链。报告必须针对个人及其所有下属。
您应该考虑使用嵌套集而不使用父指针系统。
答案 1 :(得分:0)
答案 2 :(得分:0)
我认为这是导致错误结果集的CTE的锚定成员。
其WHERE子句实际上应该是where e.CategoryId = @ParentCategoryId
。