Oracle通过递归获得所有可能的组合
Oracle get all combinations possibilities with recursivity
我真的需要你的帮助 SQL 请求。
我有一个这样的 table :
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是不可能的,我觉得像阶乘数学函数?
我尝试使用 "start with" "connect by" 但我不明白如何正确使用它。
你有什么想法吗?
感谢您的帮助。
查尔斯
试试这个查询
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
我真的需要你的帮助 SQL 请求。
我有一个这样的 table :
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是不可能的,我觉得像阶乘数学函数?
我尝试使用 "start with" "connect by" 但我不明白如何正确使用它。
你有什么想法吗?
感谢您的帮助。
查尔斯
试试这个查询
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