一个复杂问题的求解过程(三)
上一篇 / 下一篇 2008-03-08 23:59:07 / 个人分类:ORACLE
今天在PUB里面看到一个帖子:http://www.itpub.net/thread-949571-1-1.html。问题本身并不复杂,不过想借这个问题简单描述一下求解的思路。
前两篇文章介绍了利用PL/SQL构造动态SQL的方法来解决问题,这里讨论如何使用SQL来实现。
一个复杂问题的求解过程(一):http://yangtingkun.itpub.net/post/468/456641
一个复杂问题的求解过程(二):http://yangtingkun.itpub.net/post/468/456695
前面两篇文章通过PL/SQL构造动态SQL的方法来实现,这是由于构造子查询的个数是不确定的。
如果利用SQL来实现,就必须首先解决这个问题。也就是说找到一个方法,在不使用多个表连接的情况下,获取所有ID不同POWER之间组合的可能性的和。
SQL> WITH T1 ASITPUB个人空间8d3x3~} Ekv~
2 (ITPUB个人空间']n}9kK/D*QK)@
3 SELECT DISTINCT T.ID, T.VALUE, LEVEL - 1 LV, T.VALUE * (LEVEL - 1) POWER
-o3bm Vm*w ~;N0 4 FROM TITPUB个人空间3w(GK9]q
5 CONNECT BY LEVEL <= T.POWER
js'b.xv+F"sH#|0 6 )ITPUB个人空间}#RD+g-md+v;D;lb
7 SELECT * FROM T1;
ID VALUE LV POWER
a_pE%d4VDa;nO0---------- ---------- ---------- ----------ITPUB个人空间vR:l[(Pls7l%h
2 1 1 1ITPUB个人空间
x(R9s|7[ O5ND
3 4 1 4ITPUB个人空间 D0O)t
c8HI(U~
3 4 0 0
cu3L@+Z_+Y0 5 4 0 0ITPUB个人空间
M!FMD'`
b-q
1 2 2 4ITPUB个人空间4~lj\-IP)`
5 4 1 4ITPUB个人空间qD%W$EHE'RZ
4 5 0 0ITPUB个人空间KYl5a#E2s,Z8i w
2 1 0 0
{&Qa1n_
J,A0 1 2 0 0
Mi;k ?$lrC\(c0 3 4 3 12
A"t,Z0k^J+@/F;B0 4 5 1 5ITPUB个人空间/K1mX]^5VgSi Q
3 4 2 8
N/t]a
RtC/h{0 1 2 1 2
:e U8}s;}!NF0 5 4 2 8
已选择14行。
现在得到的结果是展开了加权与VALUE相乘的所有可能性。下面要达到的目的是ID从1到5中,每个ID任选一条记录,并累加POWER的值,最后过滤结果为16的值。
最自然的想法就是多个表连接通过笛卡儿连接来实现,但是没有办法解决表连接数不确定的问题,想来想去,只有再次通过树形查询来实现:
SQL> SELECT ID, SYS_CONNECT_BY_PATH(POWER, ',') POWER_LISTITPUB个人空间M8yp8WdC!]]y
2 FROM
c/od*[~J0 3 (
p0qs\6v0hl0 4 SELECT DISTINCT T.ID, T.VALUE, LEVEL - 1 LV, T.VALUE * (LEVELITPUB个人空间+yY&M$z/\5N*h/C
5 FROM TITPUB个人空间8rm*e,~B$Y:H
6 CONNECT BY LEVEL <= T.POWERITPUB个人空间r^(e2m1c/r
7 )ITPUB个人空间_
v6C4@&M
8 START WITH ID = 1ITPUB个人空间[.gnyr!n
9 CONNECT BY PRIOR ID + 1 = IDITPUB个人空间#Y'zl0c.@g
10 ORDER BY 1, 2;
ID POWER_LIST
&q^9R@5Ft%ZU0---------- ------------------------------
)?Oxcag\XL6cw0[0 1 ,0
qi)H(@nW9j0 1 ,2ITPUB个人空间1sqaBUX6]
1 ,4ITPUB个人空间}ktdX*~)~&]
2 ,0,0
*w&`G4V
Is&qw.FTu2I0 2 ,0,1ITPUB个人空间%C;jI H!v4l)b
2 ,2,0ITPUB个人空间a8M,fk(O0go'Srt"T
2 ,2,1ITPUB个人空间te)HDP(wl
2 ,4,0ITPUB个人空间6@6X
ro\2[s"^P
2 ,4,1ITPUB个人空间"p"O|Q4|N Px3o"H OT
3 ,0,0,0ITPUB个人空间#xY%STk{H;bQ}
3 ,0,0,12
;N6p]4lOUZ K&ie0 3 ,0,0,4ITPUB个人空间BMu6MNj2E@.F~2o
3 ,0,0,8ITPUB个人空间:O2]{M7f7?%WaL+O5}
3 ,0,1,0
%Dzd&M!xp$[
cj4?,M0 3 ,0,1,12ITPUB个人空间O dX)~3J`-f
3 ,0,1,4
7n+x;YZv1M(Q6mO0 3 ,0,1,8ITPUB个人空间i`J K*R-X
3 ,2,0,0
B)e N8{:b0 3 ,2,0,12
-NK G5a"N6\0 3 ,2,0,4ITPUB个人空间EEdl^&S