2011-02-12 110 views
1

我需要找到當前級別或更低級別上有項目的所有類別,或者有子項目的項目。 類別有CategoryID,ParentCategoryID。 項目有一個CategoryID。遞歸SQL問題

我有大部分的解決方案的使用存儲過程:

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

突出顯示您的代碼,然後單擊「{}」按鈕 – 2011-02-12 00:38:06

+0

感謝您的格式幫助!它看起來好多了。 – 2011-02-13 00:19:05

回答

0
  1. 拿出你的where子句(我不認爲這是需要)
  2. 留下你的項目加入,然後加入也給你的項目表和分類表之間的get_cat_heir。
2

我不確定這是一個新的解決方案還是正在開發中。如果使用嵌套集合表示層次結構,執行這種類型的報告要容易得多。 Joe Celko在這個話題上有一些很棒的文章。

幾年前,我確實要求跟蹤系統,其中有一個深層次的命令鏈。報告必須針對個人及其所有下屬。

您應該考慮使用嵌套集而不使用父指針系統。

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

+0

偉大的建議。另請參見http://dev.mysql.com/tech-resources/articles/hierarchical-data.html – CurtainDog 2011-02-12 00:51:59

0

我認爲這是導致錯誤的結果集的CTE的錨固構件。

它的WHERE子句實際上應該是where e.CategoryId = @ParentCategoryId