当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《Oracle通过递归获得所有组合可能性》经验,为你挑选了1个好方法。

我真的需要你的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> krokodilko..:

试试这个查询

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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有