用sql语句把传统存储树的表,转换成节点与叶子节点对照表(oracle)

出于某种原因(懒),想在sql中实现数据按照树形结构进行分组合计,在关联表的时候需要一个节点与对应叶子节点对照的表。所以不知道下面这个操作用sql语句能实现不,不想要函数或者存储过程这种的,那样的话我就在代码里写了。
希望将

id    pid
1    0
2    1
3    1
4    2
5    2
6    3
7    3

转换为

id    lid
1    4
1    5
1    6
1    7
2    4
2    5
3    6
3    7
4    4
5    5
6    6
7    7

另外树的表结构中还有是否是叶子节点和层级这两个字段,如果有需要的字段也可以自己加

另外本问题源于个人的求知与探索欲望,不要喷我“sql不是啥都能干的”这种

阅读 2.9k
1 个回答

这种需求可用SQL的recursive with实现:

with tree(id, pid) as (
    select * from (values(1,0),(2,1),(3,1),(4,2),(5,2),(6,3),(7,3)) as tree(id, pid)),
    
result(id, lid) as (
    select id, id from tree where id not in (select pid from tree) -- first leaves
    union all -- then include parents iteratively
    select tree.pid, result.lid
    from result inner join tree on result.id = tree.id)

select * from result
order by id

以上在 MSSQL2014 运行通过。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进