2011-02-14 118 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不仅需要扫描一次表,而且还要扫描每个级别的表)。