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

1 sql oracle recursion combinations factorial

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

我有这样一张桌子:

ID|LABEL|PRICE
1 |A    |10
2 |B    |15
3 |C    |20
4 |D    |30
5 |E    |35
Run Code Online (Sandbox Code Playgroud)

我想得到所有组合可能与sql请求(或pl/sql程序)喜欢这样:

A, AB, AC, AD, AE, ABC, ABD, ABE, AC, ABCD, ABCE, ABCDE... DE, BDE, CE...
Run Code Online (Sandbox Code Playgroud)

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

我尝试"开始""连接",但我不明白如何正确使用它.

你有想法得到这个吗?

谢谢你的帮助.

查尔斯

kro*_*lko 5

试试这个查询

select sys_connect_by_path( label, ';' )
from table1
connect by nocycle label <> prior label
;
Run Code Online (Sandbox Code Playgroud)

或者这个:

select sys_connect_by_path( label, ';' )
from table1
connect by nocycle label > prior label
;
Run Code Online (Sandbox Code Playgroud)

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


要获得价格总和,您可以使用子查询因子子句,这样:

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;
Run Code Online (Sandbox Code Playgroud)

第三列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
Run Code Online (Sandbox Code Playgroud)