这个SELECT语句带来奇怪的结果:事先连接带来意想不到的效果
with data(id, seqno, cs_prev_seqno, descr) as
(select 1, 1, 0, 'Id 1 Step1' from dual
union all
select 1, 2, 1, 'Id 1 Step2' from dual
union all
select 1, 3, 2, 'Id 1 Step3' from dual
union all
select 1, 4, 1, 'Id 1 Step4' from dual
union all
select 2, 1, 0, 'Id 2 Step1' from dual
union all
select 2, 2, 1, 'Id 2 Step2' from dual)
select id,
sys_connect_by_path(seqno, '/') as path,
seqno,
cs_prev_seqno,
descr,
level
from data
where id = 1
connect by prior seqno = cs_prev_seqno
start with cs_prev_seqno = 0;
我预计connect by
只是为了与ID = 1的行完成的,但结果是:
id path seq seq_prev descr level
1 /1 1 0 Id 1 Step1 1
1 /1/2 2 1 Id 1 Step2 2
1 /1/2/3 3 2 Id 1 Step3 3
1 /1/2/3 3 2 Id 1 Step3 3
1 /1/4 4 1 Id 1 Step4 2
1 /1/2 2 1 Id 1 Step2 2
1 /1/2/3 3 2 Id 1 Step3 3
1 /1/2/3 3 2 Id 1 Step3 3
1 /1/4 4 1 Id 1 Step4 2
IE首先是connect by
是所有行完成的,后来的结果是由ID过滤。
作为一种解决方法,下面的语句提供了正确的结果:
with data(id,
seqno,
cs_prev_seqno,
descr) as
(select 1, 1, 0, 'Id 1 Step1'
from dual
union all
select 1, 2, 1, 'Id 1 Step2'
from dual
union all
select 1, 3, 2, 'Id 1 Step3'
from dual
union all
select 1, 4, 1, 'Id 1 Step4'
from dual
union all
select 2, 1, 0, 'Id 2 Step1'
from dual
union all
select 2, 2, 1, 'Id 2 Step2'
from dual
)
,
data2 as
(select d.id,
d.seqno,
d.cs_prev_seqno,
d.id || '.' || d.seqno as id_seqno,
d.id || '.' || d.cs_prev_seqno as cs_id_prev_seqno,
d.descr
from data d)
select id,
sys_connect_by_path(seqno, '/') as path,
seqno,
cs_prev_seqno,
descr,
level
from data2
where id = 1
connect by prior id_seqno = cs_id_prev_seqno
start with cs_prev_seqno = 0;
- >
id path seq seq_prev descr level
1 /1 1 0 Id 1 Step1 1
1 /1/2 2 1 Id 1 Step2 2
1 /1/2/3 3 2 Id 1 Step3 3
1 /1/4 4 1 Id 1 Step4 2
但我想应该有实现这个更简单的方法?提前致谢!