2015-12-03 112 views
0

我不確定這是什麼正確的搜索詞,請讓我知道如果已經有這個答案。 如: 我有這些數據Oracle pl/sql排列和組合

A 
B 
C 
D 
E 

什麼是計算每增加一個可能的組合的最佳方式?如:

A 
A+B 
A+C 
A+D 
A+E 
A+B+C 
A+B+D 
A+B+E 
A+C+D 
A+C+E 
A+C+D+E 
A+B+C+D 
A+B+C+E 
A+B+C+D+E 
B 
B+C 
B+D 
B+E 
B+C+D 
B+C+E 
B+C+D+E 
C 
C+D 
C+E 
... 
The list goes on....... 

有什麼辦法可以做到這一點?

5個數據不固定。我可能有10 .. 20或50或1000 :(

謝謝

+0

你只是試圖做的可能的組合計數?這是一個衆所周知的公式,不需要任何SQL。或者你是否試圖實際列舉每種可能的組合? – Rabbit

+0

你好,不,我不是隻想做一些可能的組合。我需要每個組合的結果 –

+0

爲什麼你需要這樣的東西?您的服務器將無法處理它。該表幾乎不可用 – Rabbit

回答

2

在SQL中,你幾乎可以用這一套left join就做這個。

select (t1.col + coalesce(t2.col, 0) + coalesce(t3.col, 0) + 
     coalesce(t4.col, 0) + coalesce(t5.col, 0) 
     ) as sumcombo 
from t t1 left join 
    t t2 
    on t1.col < t2.col left join 
    t t3 
    on t2.col < t3.col left join 
    t t4 
    on t3.col < t4.col left join 
    t t5 
    on t4.col < t5.col; 

它不相當的工作,因爲你永遠無法得到的只是「A」的實例,而不是:。

with t as (
     select col 
     from table 
     union all 
     select NULL 
     from dual 
    ) 
select (t1.col + coalesce(t2.col, 0) + coalesce(t3.col, 0) + 
     coalesce(t4.col, 0) + coalesce(t5.col, 0) 
     ) as sumcombo 
from table t1 left join 
    t t2 
    on t1.col < t2.col or t2.col is null left join 
    t t3 
    on t2.col < t3.col or t3.col is null left join 
    t t4 
    on t3.col < t4.col or t4.col is null left join 
    t t5 
    on t4.col < t5.col or t5.col is null; 
+0

對不起,我沒有在我的問題中明確說明。數據的數量是不固定的:(我可能有10或20或50或1000行 –

+2

列出1000個元素的所有排列在我的有生之年不會發生 –

+0

是的,我知道甚至50個元素將返回3 * 10^64的結果,這是荒謬的。是否有靈活的方式來做存儲過程? –

1

這可以通過一個分層查詢,首先需要解決,建立一個大的兒童柱col2用於連接離子:

-- your test data set 
with testdata as 
(select 'A' as col from dual 
    union 
    select 'B' from dual 
    union 
    select 'C' from dual 
    union 
    select 'D' from dual 
    union 
    select 'E' from dual), 

-- create child column 
testdata2 as 
(select t.col as col1, t.col as col2 from testdata t) 

select level, sys_connect_by_path(col1, '/') path 
    from testdata2 t 
connect by prior col1 < col2 
order by level, sys_connect_by_path(col1, '/'); 

結果:

1 /A 
1 /B 
1 /C 
1 /D 
1 /E 
2 /A/B 
2 /A/C 
2 /A/D 
2 /A/E 
2 /B/C 
2 /B/D 
2 /B/E 
2 /C/D 
2 /C/E 
2 /D/E 
3 /A/B/C 
3 /A/B/D 
3 /A/B/E 
3 /A/C/D 
3 /A/C/E 
3 /A/D/E 
3 /B/C/D 
3 /B/C/E 
3 /B/D/E 
3 /C/D/E 
4 /A/B/C/D 
4 /A/B/C/E 
4 /A/B/D/E 
4 /A/C/D/E 
4 /B/C/D/E 
5 /A/B/C/D/E