SQL 树结构 递归找方案

StormFour 发布于 2013/04/23 10:29
阅读 723
收藏 2

现有两张表t_tree(树)和fa(方案)

t_tree表结构为

fa表结构为

两张表数据(左为t_tree,右为fa)如下:

表数据更直观的图展现如下

现需要求得各个节点的方案,节点没有方案的取最近的父节点的方案。最后查询结果类似于如下

查询结构类似于

需要怎么解?  需要一个SQL方案 

 

 

加载中
0
kenyon_君羊
StormFour
StormFour
嗯,是的
0
宏哥
宏哥

一张表即可

pid , 根的pid指向自己

0
mark35
mark35
可以把fa表数据合并到t_tree表中。至于无方案名节点的取值,可以考虑在应用层处理,SQL中也可以不过会比较复杂
StormFour
StormFour
会有一个方案对应多个节点的情况
0
chally
chally

试下 connect  by,oracle结构化查询。

0
StormFour
StormFour

结贴,自己写出来了:

select id, fid, root_id, faid from (
  select id, fid, root_id, faid, lvl, min(lvl) over(partition by id) min_lvl from (
    select id, fid, root_id, (select tr.fa from t_tree tr where tr.id = t.root_id) faid, lvl from (
      select id, fid, connect_by_root(id) root_id, fa, level lvl from t_tree connect by prior id = fid
    ) t
  )
  where faid is not null
  order by id, lvl
)
where lvl = min_lvl
0
宏哥
宏哥

引用来自“StormFour”的答案

结贴,自己写出来了:

select id, fid, root_id, faid from (
  select id, fid, root_id, faid, lvl, min(lvl) over(partition by id) min_lvl from (
    select id, fid, root_id, (select tr.fa from t_tree tr where tr.id = t.root_id) faid, lvl from (
      select id, fid, connect_by_root(id) root_id, fa, level lvl from t_tree connect by prior id = fid
    ) t
  )
  where faid is not null
  order by id, lvl
)
where lvl = min_lvl

connect by 这种只能自己写.

问别人比自己写更难


0
吐槽的达达仔
吐槽的达达仔

其实不只是Oracle,DB2也支持递归查询。

用with 语句可以写出来。。

0
kenyon_君羊
kenyon_君羊
楼主你很棒
0
fhp0917
fhp0917
还有一个方案供楼主参考,就是加一个字段叫location,它是他父节点们的ID拼接,如“1_2_3”用个“_”之类的字符分割。在查询时只需要like一下就可以将子节点都查询出来。
mark35
mark35
这是个不够严谨的方法。效率也低下,不过好在这种节点表一般数据量很小,性能损失倒不大
返回顶部
顶部