Oracle通过递归获得所有组合可能性

时间:2015-12-14 16:37:22

标签: sql oracle recursion combinations factorial

我真的需要你的SQL请求帮助。

我有一张这样的表:

ID|LABEL|PRICE
1 |A    |10
2 |B    |15
3 |C    |20
4 |D    |30
5 |E    |35

我想通过sql请求(或pl / sql程序)得到所有可能的组合,如下所示:

A, AB, AC, AD, AE, ABC, ABD, ABE, AC, ABCD, ABCE, ABCDE... DE, BDE, CE...

每个标签只能出现一次,例如,ABA是不可能的,我认为它就像一个因子数学函数?

我尝试用"以"开头"通过"连接但我不明白如何正确使用它。

你有想法得到这个吗?

感谢您的帮助。

查尔斯

1 个答案:

答案 0 :(得分:5)

尝试此查询

select sys_connect_by_path( label, ';' )
from table1
connect by nocycle label <> prior label
;

或者这个:

select sys_connect_by_path( label, ';' )
from table1
connect by nocycle label > prior label
;

========== 编辑 ==========

要获得价格总和,您可以使用子查询因子条款:

WITH abc( label, pricesum, pricelist, lastlabel) AS (    
     SELECT label, 
            price, 
            cast( price as varchar2(1000)), 
            label    
     FROM table1    
     UNION ALL    
     SELECT a.label || ';' || b.label, 
            a.price + b.price, 
            a.pricelist|| '+'||b.price , 
            b.label    
     FROM abc a    
     JOIN table1 b    
     ON b.label > a.lastlabel 
) CYCLE label SET cycle TO 1 DEFAULT 0 
SELECT * FROM abc;

第三列pricelist显示了正在汇总的所有价格的列表,
例如:

label pricesum pricelist  lastlabel
A       10     10           A   0
B       15     15           B   0
A;B     25     10+15        B   0
A;C     30     10+20        C   0
A;D     40     10+30        D   0
A;C;D   60     10+20+30     D   0
A;C;E   65     10+20+35     E   0
A;B;D;E 90     10+15+30+35  E   0
A;C;D;E 95     10+20+30+35  E   0
B;C;D;E 100    15+20+30+35  E   0