3,491
社区成员
发帖
与我相关
我的任务
分享
with t1 as (
select 'A' as parent_no, 'B' as no from dual union all
select 'A' as parent_no, 'C' as no from dual union all
select 'B' as parent_no, 'D' as no from dual union all
select 'C' as parent_no, 'E' as no from dual union all
select 'B' as parent_no, 'F' as no from dual union all
select 'C' as parent_no, 'G' as no from dual union all
select 'G' as parent_no, 'H' as no from dual union all
select 'G' as parent_no, 'I' as no from dual union all
select 'H' as parent_no, 'J' as no from dual
)
,t2 as (
select 'A' AS NO,300 AS MONEY,2400 AS ALLMONEY,1 AS RID from dual union all
select 'B' AS NO,100 AS MONEY,700 AS ALLMONEY,2 AS RID from dual union all
select 'C' AS NO,200 AS MONEY,1400 AS ALLMONEY,3 AS RID from dual union all
select 'D' AS NO,100 AS MONEY,100 AS ALLMONEY,4 AS RID from dual union all
select 'E' AS NO,400 AS MONEY,400 AS ALLMONEY,5 AS RID from dual union all
select 'F' AS NO,500 AS MONEY,500 AS ALLMONEY,6 AS RID from dual union all
select 'G' AS NO,200 AS MONEY,800 AS ALLMONEY,7 AS RID from dual union all
select 'H' AS NO,100 AS MONEY,300 AS ALLMONEY,8 AS RID from dual union all
select 'I' AS NO,300 AS MONEY,300 AS ALLMONEY,9 AS RID from dual union all
select 'J' AS NO,200 AS MONEY,200 AS ALLMONEY,10 AS RID from dual
)
select max(no) keep(dense_rank first order by ph desc) res
from (select a.no, connect_by_isleaf isleaf, connect_by_root(a.no) rt,
connect_by_root(allmoney) rt_am,
sys_connect_by_path(lpad(allmoney, 8, '0') || (100000 - rid),
'->') ph
from t1 a
left join t2 b
on a.no = b.no
start with parent_no = 'A'
connect by prior a.no = parent_no)
where isleaf = 1
两个参数:
sys_connect_by_path(lpad(allmoney, 8, '0') || (100000 - rid),'->') ph
8:要求大于等于allmoney作为字符串的最大长度
100000:要求大于等于最大顺序数
with table1 as (
select 'A' as parent_no, 'B' as no from dual union all
select 'A' as parent_no, 'C' as no from dual union all
select 'B' as parent_no, 'D' as no from dual union all
select 'C' as parent_no, 'E' as no from dual union all
select 'B' as parent_no, 'F' as no from dual union all
select 'C' as parent_no, 'G' as no from dual union all
select 'G' as parent_no, 'H' as no from dual union all
select 'G' as parent_no, 'I' as no from dual union all
select 'H' as parent_no, 'J' as no from dual
),
table2 as (
select 'A' AS NO,300 AS MONEY,2400 AS ALLMONEY,1 AS RID from dual union all
select 'B' AS NO,100 AS MONEY,700 AS ALLMONEY,2 AS RID from dual union all
select 'C' AS NO,200 AS MONEY,1400 AS ALLMONEY,3 AS RID from dual union all
select 'D' AS NO,100 AS MONEY,100 AS ALLMONEY,4 AS RID from dual union all
select 'E' AS NO,400 AS MONEY,400 AS ALLMONEY,5 AS RID from dual union all
select 'F' AS NO,500 AS MONEY,500 AS ALLMONEY,6 AS RID from dual union all
select 'G' AS NO,200 AS MONEY,800 AS ALLMONEY,7 AS RID from dual union all
select 'H' AS NO,100 AS MONEY,300 AS ALLMONEY,8 AS RID from dual union all
select 'I' AS NO,300 AS MONEY,300 AS ALLMONEY,9 AS RID from dual union all
select 'J' AS NO,200 AS MONEY,200 AS ALLMONEY,10 AS RID from dual
),
t1 as (
select table1.*,level rn from table1 start with parent_no ='A' connect by nocycle parent_no = prior no)
select * from (
select t1.*,table2.allmoney ,row_number() over (partition by rn order by allmoney desc,rid asc) rn1 from t1,table2 where t1.no = table2.no)
where rn1 =1