【问题标题】:Oracle get all combinations possibilities with recursivityOracle 通过递归获得所有组合的可能性
【发布时间】:2016-03-20 05:38:52
【问题描述】:

我真的需要你的帮助来处理一个 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是不可能的,我觉得它就像一个阶乘数学函数?

我尝试使用“start with”“connect by”,但我不明白如何正确使用它。

你有想法得到这个吗?

感谢您的帮助。

查尔斯

【问题讨论】:

  • 到目前为止你写过代码吗?
  • 我尝试了,但我无法得出结论性的结果 :-(

标签: sql oracle recursion combinations factorial


【解决方案1】:

试试这个查询

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 显示了所有价格的列表 thar 正在汇总,
例如:

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,对我来说也是一样的。最后,每个标签都有一个欧元值,现在我需要每个字母值的总和。
  • 第二个查询connect by nocycle label &gt; prior label 只会给你A;B 而没有'B;A。第一个给出了所有可能的组合。我在问题中看不到任何 € 值,请编辑问题并补充缺失的部分或创建一个新问题。
  • 我编辑我的问题以添加价格列。对于第二个查询“标签 > 先前标签”,这正是我所需要的。为了得到价格列的总和,我在选择中有“'0' || sys_connect_by_path(prix, '+')”,我创建了一个 calc() 函数来解释......我认为存在一个必须更简单的解决方案: select sys_connect_by_path(label, ' '), calc('0' || sys_connect_by_path(prix, '+')) from supp connect by nocycle label > prior label;
  • 我在答案中添加了一个获取价格总和的子查询分解查询示例
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多