|
3 楼的lastwinner的code同样有提升空间。
with t1 as
(select rownum-1 c from dual connect by rownum < 3),
t2 as
(select a.c a, b.c b, c.c, d.c d, e.c e
from t1 a, t1 b, t1 c, t1 d, t1 e
where a.c + b.c + c.c + d.c + e.c < 3),
t3 as
(select a.a || a.b || a.c || a.d || a.e || b.a || b.b ||
b.c || b.d || b.e || c.a || c.b || c.c || c.d ||
c.e || d.a || d.b || d.c || d.d || d.e || e.a ||
e.b || e.c || e.d || e.e x,
(a.a + a.b + a.c + a.d + a.e + b.a + b.b +
b.c + b.d + b.e + c.a + c.b + c.c + c.d +
c.e + d.a + d.b + d.c + d.d + d.e + e.a +
e.b + e.c + e.d + e.e) y,
max(a.a + a.b + a.c + a.d + a.e + b.a + b.b + b.c + b.d + b.e + c.a + c.b + c.c + c.d + c.e + d.a + d.b + d.c + d.d + d.e + e.a + e.b + e.c + e.d + e.e)over() z
from t2 a, t2 b, t2 c, t2 d, t2 e
where a.a + b.a + c.a + d.a + e.a < 3
and a.b + b.b + c.b + d.b + e.b < 3
and a.c + b.c + c.c + d.c + e.c < 3
and a.d + b.d + c.d + d.d + e.d < 3
and a.e + b.e + c.e + d.e + e.e < 3
and a.c + b.b + c.a < 3
and a.d + b.c + c.b + d.a < 3
and a.e + b.d + c.c + d.b + e.a < 3
and b.e + c.d + d.c + e.b < 3
and c.e + d.d + e.c < 3
and a.c + b.d + c.e < 3
and a.b + b.c + c.d + d.e < 3
and a.a + b.b + c.c + d.d + e.e < 3
and b.a + c.b + d.c + e.d < 3
and c.a + d.b + e.c < 3)
select rank() over(order by x desc)rn ,x from t3 where y = z
最简单的就是在t2中预先计算 a.c+b.c +c.c+d.c + e.c 和 a.c||b.c||c.c||d.c||e.c,避免在笛卡尔积时做这些运算,同时获得代码的精简性和性能,也降低copy paste出错概率
with t1 as
(select rownum-1 c from dual connect by rownum < 3),
t2 as
(select a.c a, b.c b, c.c, d.c d, e.c e ,a.c+b.c +c.c+d.c + e.c n,a.c||b.c||c.c||d.c||e.c s
from t1 a, t1 b, t1 c, t1 d, t1 e
where a.c + b.c + c.c + d.c + e.c < 3) ,
t3 as
(select a.s || b.s || e.s ||d.s || e.s x,
(a.n + b.n + c.n + d.n + e.n ) y,
max(a.n + b.n + c.n + d.n + e.n)over() z
from t2 a, t2 b, t2 c, t2 d, t2 e
where a.a + b.a + c.a + d.a + e.a < 3
and a.b + b.b + c.b + d.b + e.b < 3
and a.c + b.c + c.c + d.c + e.c < 3
and a.d + b.d + c.d + d.d + e.d < 3
and a.e + b.e + c.e + d.e + e.e < 3
and a.c + b.b + c.a < 3
and a.d + b.c + c.b + d.a < 3
and a.e + b.d + c.c + d.b + e.a < 3
and b.e + c.d + d.c + e.b < 3
and c.e + d.d + e.c < 3
and a.c + b.d + c.e < 3
and a.b + b.c + c.d + d.e < 3
and a.a + b.b + c.c + d.d + e.e < 3
and b.a + c.b + d.c + e.d < 3
and c.a + d.b + e.c < 3)
select rank() over(order by x desc)rn ,x from t3 where y = z
old code: 381 word, 1410 char, run time 5.6 sec
new code: 269 word , 1051 char, tun time 3.7 sec |
|