我有一个分层表
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
)
;
这应该适用于大多数 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