2011-02-14 116 views
4

我有一個數據庫表,它具有以下形式Sql自加入查詢?如何獲取類別的子類別?

 
catID | category  | parentID 
1  | firstCategory | null 
2  | SubCategory1 | 1 
3  | SubCategory2 | 1 
4  | subSub1  | 3 

等等...

有類別的多級。可以使用什麼查詢獲取以下格式的記錄:

 
catID | category 
1  | firstCategory 
2  | firstCategory/SubCategory1 
3  | firstCategory/SubCategory2 
4  | firstCategory/SubCategory2/subSub1 

類別ID將是最後一個類別的ID。如何編寫查詢以將類別加入到所有級別?不同類別的準確級數是不同的?

我正在使用mySQL。

+1

你知道嵌套的最大深度嗎?如果不是,這變成一個迭代函數,需要更復雜的代碼。 – Matthew 2011-02-14 18:24:15

回答

2

對於6(包括根)的最大深度,則可以使用此

select l0.catID, 
    concat(
     case when l5.catID is null then '' else concat(l5.category, '/') end 
    , case when l4.catID is null then '' else concat(l4.category, '/') end 
    , case when l3.catID is null then '' else concat(l3.category, '/') end 
    , case when l2.catID is null then '' else concat(l2.category, '/') end 
    , case when l1.catID is null then '' else concat(l1.category, '/') end 
    , l0.category) 
from catcat l0 
left join catcat l1 on l0.parentID=l1.catID 
left join catcat l2 on l1.parentID=l2.catID 
left join catcat l3 on l2.parentID=l3.catID 
left join catcat l4 on l3.parentID=l4.catID 
left join catcat l5 on l4.parentID=l5.catID 

展開圖案根據需要更長的最大深度。

0

甲骨文有這個功能,我工作的公司使用它來描述你正在描述的內容。儘管如此,查詢可能會非常繁重。在這裏可以找到這個鏈接的功能(「開始」和「連接」關鍵字)的一個很好的寫法,以及你可能試圖包圍你的頭部的僞代碼...雖然cyberkiwi的答案可能適用於所有實際目的......

http://www.adp-gmbh.ch/ora/sql/connect_by.html

0

有什麼cyberkiwi說一種替代方案:查詢整個表和樹建築物在內存中。命令式語言非常適合,而SQL不是。性能會更好(因爲SQL不僅需要掃描一次表,而且還要掃描每個級別的表)。