|
好吧。。。我用最烂的方法实现了,再多个人我就要死了。。。
CREATE TABLE bridge_crossing (
name NUMBER PRIMARY KEY
,time NUMBER
);
INSERT INTO bridge_crossing VALUES (1, 1);
INSERT INTO bridge_crossing VALUES (2, 2);
INSERT INTO bridge_crossing VALUES (3, 5);
INSERT INTO bridge_crossing VALUES (4, 10);
COMMIT;
with b as
(select c.onecol1,c.onecol2,d.name ret
from bridge_crossing d,
(select a.name onecol1 ,b.name onecol2 from bridge_crossing a,bridge_crossing b where a.name<>b.name) c --组合第一次去的人
where c.onecol1=d.name or c.onecol2=d.name
), --组合第一次去加回来的人
c as
(select b.onecol1,b.onecol2,b.ret,g.name from bridge_crossing g,b where g.name<>(case when b.onecol1<>b.ret then b.onecol1 else b.onecol2 end))
, d as
(
select x.*,x.name second1,m.name second2 from c x,c m where x.name<>m.name
)
--组合第二次去的可能性 onecol1和onecol2代表第一次去的组合,ret代表回来的人,second1和second2代表第二次去的人
,
e as (
select d.onecol1,d.onecol2,d.ret,d.second1,d.second2 from d where
(case when d.onecol1<>d.ret then d.onecol1 else d.onecol2 end)<>d.second1
and (case when d.onecol1<>d.ret then d.onecol1 else d.onecol2 end)<>d.second2 --这里排除不可能的情况
group by d.onecol1,d.onecol2,d.ret,d.second1,d.second2
order by d.onecol1,d.onecol2,d.ret
)
/* select * from e*/
,h as (
select e.*, f.name ret2 from e, bridge_crossing f where f.name in ((case when e.onecol1=e.ret then e.onecol2 else e.onecol1 end),e.second1,e.second2)
),
o as (
select h.*,j.name from h ,bridge_crossing j where
/*(j.name = (case when h.onecol1=h.ret then h.onecol1 else h.onecol2 end) and j.name= (case when h.second1=ret2 then second1 else second2 end))
and*/ j.name<>( case when h.onecol1= h.ret then h.onecol2 else h.onecol1 end )
and (j.name = (case when ret not in (second1,second2) then ret end) or (j.name not in (onecol1,onecol2,second1,second2))) --这里最后一个人是第一次去回来后第二次没去的人,或者一次都没去的人
and j.name<>( case when h.second1= h.ret2 then h.second2 else h.second1 end )
and j.name<>h.ret2
)
select o.*, case when onecol1>onecol2 then onecol1 else onecol2 end|| ret
||case when second1>second2 then second1 else second2 end ||ret2||case when ret2>name then ret2 else name end as time,
decode(case when onecol1>onecol2 then onecol1 else onecol2 end,1,1,2,2,3,5,4,10)+ decode(ret,1,1,2,2,3,5,4,10)
+decode(case when second1>second2 then second1 else second2 end,1,1,2,2,3,5,4,10)+decode(ret2,1,1,2,2,3,5,4,10)+
decode(case when ret2>name then ret2 else name end,1,1,2,2,3,5,4,10) as sumtime
from o
order by sumtime
结果:
1 2 1 3 4 2 1 21422 17
1 2 1 4 3 2 1 21422 17
1 2 2 3 4 1 2 22412 17
1 2 2 4 3 1 2 22412 17
2 1 1 3 4 2 1 21422 17
2 1 1 4 3 2 1 21422 17
2 1 2 3 4 1 2 22412 17
2 1 2 4 3 1 2 22412 17
1 2 1 1 3 1 4 21314 19
1 2 1 1 4 1 3 21413 19
1 2 1 3 1 1 4 21314 19
1 2 1 4 1 1 3 21413 19
1 3 1 1 2 1 4 31214 19
1 3 1 1 4 1 2 31412 19
1 3 1 2 1 1 4 31214 19
1 3 1 4 1 1 2 31412 19
1 4 1 1 2 1 3 41213 19
1 4 1 1 3 1 2 41312 19
1 4 1 2 1 1 3 41213 19
后面还有很多组合。。。不知道对不对。。 |
|