|
|
学习kingtsi的思路,只求不超过一半的子集然后对调再合并,用于11GR2:
WITH t AS (
SELECT REGEXP_SUBSTR(:s,'[^,]+',1,ROWNUM) s, COUNT(*) OVER() cnt
FROM DUAL
CONNECT BY ROWNUM<=LENGTH(:s)-LENGTH(REPLACE(:s,','))+1
)
, T2(s,s1,s2,lvl,cnt) AS (
SELECT s,s s1, REPLACE(','||:s||',',','||s||',',',') as s2, 1 as lvl,cnt
FROM t
UNION ALL
SELECT t.s,t2.s1||','||t.s,REPLACE(','||t2.s2||',',','||t.s||',',',') as s2, t2.lvl+1,t.cnt
FROM t, T2
WHERE t2.s<t.s
AND t2.lvl<TRUNC(t.cnt/2)
)
SELECT s1,TRIM(BOTH ',' FROM s2) FROM t2
UNION ALL
SELECT TRIM(BOTH ',' FROM s2),s1 FROM t2
WHERE lvl<cnt/2
;
这样递归次数少了很多。 |
|