需要 SQL 查询平面结果集中的分层数据
Need SQL query for hierarchical data in a flat result set
有一个table:PS_POSITION_TBL
position_nbr reports_to descr
038 143 DIRECTOR
0418 143 ADVISOR
114 143 DG
346 114 Manager
202 114 Lead
我们要在上面构建层次结构的想法
案例 1:038、0418 和 114 向 143 报告
案例 2:346 和 202 报告给 114
所以最高级别是 143 级,然后 038,0418,114 是 2 级,因为他们向 1 级报告,然后 346 和 202 是 3 级,他们属于
3 级存储桶,他们向 2 级报告
这些可以达到 8 级(最高)
我需要的是在 Oracle 中获取以下格式的数据的查询:
level1 level2 level3 level4 level5 level6 level7 level8 descr
143 CEO
038 DIRECTOR
0418 ADVISOR
114 DG
346 Manager
202 Lead
以下查询将为您提供一个分层集,左填充 LEVEL
:
SELECT LPAD(' ', level * 2, ' ') || TO_CHAR(position_nbr), descr
FROM PS_POSITION_TBL
CONNECT BY PRIOR position_nbr = reports_to
START WITH reports_to IS NULL;
如果您不满意在单个列中显示级别 (LEVEL
) 并且每个级别都需要一列,您可以使用基于 LEVEL
的 PIVOT 但是这会使排序有问题。
select level1,level2,level3,level4,level5,level6,level7,level8,descr
from (select level as n,position_nbr as id,descr,position_nbr
from ( select position_nbr ,reports_to ,descr from PS_POSITION_TBL
union all select 143 ,null ,'CEO' from dual
) t
start with reports_to is null
connect by reports_to = prior position_nbr
)
pivot (max(position_nbr) for n in (1 as level1,2 as level2,3 as level3,4 as level4,5 as level5,6 as level6,7 as level7,8 as level8))
;
或
select decode (n,1,position_nbr) as level1
,decode (n,2,position_nbr) as level2
,decode (n,3,position_nbr) as level3
,decode (n,4,position_nbr) as level4
,decode (n,5,position_nbr) as level5
,decode (n,6,position_nbr) as level6
,decode (n,7,position_nbr) as level7
,decode (n,8,position_nbr) as level8
,descr
from (select level as n,position_nbr,descr
from ( select position_nbr ,reports_to ,descr from PS_POSITION_TBL
union all select 143 ,null ,'CEO' from dual
) t
start with reports_to is null
connect by reports_to = prior position_nbr
)
;
有一个table:PS_POSITION_TBL
position_nbr reports_to descr
038 143 DIRECTOR
0418 143 ADVISOR
114 143 DG
346 114 Manager
202 114 Lead
我们要在上面构建层次结构的想法
案例 1:038、0418 和 114 向 143 报告
案例 2:346 和 202 报告给 114
所以最高级别是 143 级,然后 038,0418,114 是 2 级,因为他们向 1 级报告,然后 346 和 202 是 3 级,他们属于 3 级存储桶,他们向 2 级报告
这些可以达到 8 级(最高)
我需要的是在 Oracle 中获取以下格式的数据的查询:
level1 level2 level3 level4 level5 level6 level7 level8 descr
143 CEO
038 DIRECTOR
0418 ADVISOR
114 DG
346 Manager
202 Lead
以下查询将为您提供一个分层集,左填充 LEVEL
:
SELECT LPAD(' ', level * 2, ' ') || TO_CHAR(position_nbr), descr
FROM PS_POSITION_TBL
CONNECT BY PRIOR position_nbr = reports_to
START WITH reports_to IS NULL;
如果您不满意在单个列中显示级别 (LEVEL
) 并且每个级别都需要一列,您可以使用基于 LEVEL
的 PIVOT 但是这会使排序有问题。
select level1,level2,level3,level4,level5,level6,level7,level8,descr
from (select level as n,position_nbr as id,descr,position_nbr
from ( select position_nbr ,reports_to ,descr from PS_POSITION_TBL
union all select 143 ,null ,'CEO' from dual
) t
start with reports_to is null
connect by reports_to = prior position_nbr
)
pivot (max(position_nbr) for n in (1 as level1,2 as level2,3 as level3,4 as level4,5 as level5,6 as level6,7 as level7,8 as level8))
;
或
select decode (n,1,position_nbr) as level1
,decode (n,2,position_nbr) as level2
,decode (n,3,position_nbr) as level3
,decode (n,4,position_nbr) as level4
,decode (n,5,position_nbr) as level5
,decode (n,6,position_nbr) as level6
,decode (n,7,position_nbr) as level7
,decode (n,8,position_nbr) as level8
,descr
from (select level as n,position_nbr,descr
from ( select position_nbr ,reports_to ,descr from PS_POSITION_TBL
union all select 143 ,null ,'CEO' from dual
) t
start with reports_to is null
connect by reports_to = prior position_nbr
)
;