基于叶节点转置层次表

问题描述 投票:0回答:1

我有一个分层表

categories
如下:

id 名字 parent_id
1 住宿
2 交通
3 实用工具 1
4 保养 1
5 私人 2
6 公开 2
7 电力 3
8 煤气 3
9 互联网 3
10 花园服务 4
11 维修 4
12 汽车还款 5
13 .... ..

我想将其转置为每个

leaf
显示一行,如下所示(我知道预先级别最多为 3)

叶子_id 叶子名称 parent_id_1 parent_name_1 parent_id_2 parent_name_2
9 互联网 3 实用工具 1 住宿
8 煤气 3 实用工具 1 住宿
12 汽车还款 5 私人 2 交通
6 公开 2 交通
.. .. .. .. .. .. ..

我尝试了以下查询,但我就是无法得到正确的结果(例如,无法获取父母的姓名,只有 id:

SELECT * FROM
(
  SELECT id, name ,parent_id, level l
  FROM categories
connect by prior parent_id = id
)
PIVOT
(
  max(id)  --pivot clause
  FOR l   --pivot_for_clause
  IN (1 parent_id_1, 2 parent_id_2, 3 parent_id_2)  --pivot_in_clause
)
;
sql oracle-database hierarchical-data
1个回答
0
投票

这应该适用于大多数 RDBMS(不使用特定的 SQL 扩展或更高级的函数):

With LeafNodes as (
select *
from MyTbl LN
where not exists 
     (select 1
      from MyTbl PL
      where PL.parent_id=LN.id)
)
select  LN.*, P1.*,P2.*
from LeafNodes LN
     left join
     MyTbl P1
     on P1.id=LN.parent_id
     left join
     MyTbl P2
     on P2.id=P1.parent_id
© www.soinside.com 2019 - 2024. All rights reserved.