Sql Oracle使用递归性获取所有组合可能性

Sql Oracle使用递归性获取所有组合可能性,sql,oracle,recursion,combinations,factorial,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是不可能的,我想它就像一个阶乘数学函

对于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是不可能的,我想它就像一个阶乘数学函数

我尝试使用“开始”和“连接方式”,但我不知道如何正确使用它

你有办法得到这个吗

谢谢你的帮助

查尔斯

试试这个查询

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

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


要获得价格总和,可以使用子查询factoring子句,方法如下:

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
请尝试此查询

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

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


要获得价格总和,可以使用子查询factoring子句,方法如下:

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

到目前为止你写过代码吗?我试过了,但没有得出结论性的结果:-(到目前为止你写过代码吗?我试过了,但没有得出结论性的结果:-(我如何消除B;a(例如)因为我已经有了A;B,对我来说是一样的。最后,每个标签都有一个欧元值,现在我需要每个字母值的总和。第二个查询
connectbynocycle Label>previor Label
只会给你
A;B
而没有
'B;A
。第一个查询给出了所有可能的组合。我看不到任何欧元值问题,请编辑问题并补充缺少的部分或创建一个新问题。我编辑问题以添加价格列。第二个查询“label>Previor label”正是我需要的。要获得价格列的总和,我在选择中使用“'0'| | sys_connect_by_path(prix,+”),然后创建一个计算()函数来解释…我认为存在一个更简单的解决方案:从supp connect by nocycle label>Previor label中选择sys_connect_by_path(label.)、calc('0'| | sys_connect_by_path(prix,+));我在答案中添加了一个子查询分解查询的示例,该查询获得价格的总和,显示我可以消除B;a(例如)因为我已经有了A;B,对我来说是一样的。最后,每个标签都有一个欧元值,现在我需要每个字母值的总和。第二个查询
connectbynocycle Label>previor Label
只会给你
A;B
而没有
'B;A
。第一个查询给出了所有可能的组合。我看不到任何欧元值问题,请编辑问题并补充缺少的部分或创建一个新问题。我编辑问题以添加价格列。第二个查询“label>Previor label”正是我需要的。要获得价格列的总和,我在选择中使用“'0'| | sys_connect_by_path(prix,+”),然后创建一个计算()函数来解释…我认为存在一个更简单的解决方案:从supp connect by nocycle label>Previor label中选择sys_connect_by_path(label),calc('0'| | sys_connect_by_path(prix,+);我在答案中添加了一个获得价格总和的子查询分解查询的示例