又一个有趣的sql问题
作者: oldwain(http://oldwain.itpub.net)发表于: 2004.10.27 14:16
分类: Oracle
出处: http://oldwain.itpub.net/post/6/3867
---------------------------------------------------------------
问题来源: http://www.itpub.net/showthread.php?threadid=281465&pagenumber=
原文标题:1 个很难的SQL问题
表 t0 (f0 number(2)) ,f0列的数据为从1至9。
需要提取 1,2,3......7,8,9 中相加等于15 的组合。
比如:
1 2 3 4 5
6 9
7 8
3 5 7
。。。。。。。。。。。
解决方法:
假设:
只允许取不重复的数字
分析:
在前面的假设情况下, 要组成15, 极端情况需要 1 2 3 4 5五个数字, 因此不必考虑5个以上的数字组成
预备工作:
预先插入一条记录0
insert into t0 values (0);
commit;
当然, 不做这一步也可以. 只要将下面的语句中所有的t0 替换为 (select * from t0 union select 0 from dual)即可, 只是使得语句变得不太简洁.
SQL> select * from t0; F0 --- 1 2 3 4 5 6 7 8 9 0 10 rows selected. real: 10 SQL> select
2 a1.f0,
3 a2.f0,
4 a3.f0,
5 a4.f0,
6 a5.f0
7 from
8 t0 a1,
9 t0 a2,
10 t0 a3,
11 t0 a4,
12 t0 a5
13 where
14 a1.f0 +
15 a2.f0 +
16 a3.f0 +
17 a4.f0 +
18 a5.f0 =15
19 and (a1.f0 < a2.f0 or a1.f0 = 0)
20 and (a2.f0 < a3.f0 or a2.f0 = 0)
21 and (a3.f0 < a4.f0 or a3.f0 = 0)
22 and (a4.f0 < a5.f0 or a4.f0 = 0)
23 order by
24 a1.f0,
25 a2.f0,
26 a3.f0,
27 a4.f0,
28 a5.f0
29 /
F0 F0 F0 F0 F0
--- --- --- --- ---
0 0 0 6 9
0 0 0 7 8
0 0 1 5 9
0 0 1 6 8
0 0 2 4 9
0 0 2 5 8
0 0 2 6 7
0 0 3 4 8
0 0 3 5 7
0 0 4 5 6
0 1 2 3 9
0 1 2 4 8
0 1 2 5 7
0 1 3 4 7
0 1 3 5 6
0 2 3 4 6
1 2 3 4 5
17 rows selected.
real: 10
SQL>
(需要引用, 请注明出处: http://oldwain.itpub.net)




