|
终于把11GR2折腾好了,第一件事就是玩玩这个递归的WITH子查询:
VAR s VARCHAR2(200);
EXEC :s := 'A,B,C,D,E,F';
WITH t AS (
SELECT REGEXP_SUBSTR(:s,'[^,]+',1,ROWNUM) s
FROM DUAL
CONNECT BY ROWNUM<=LENGTH(:s)-LENGTH(REPLACE(:s,','))+1
)
, T2(s,s1,s2) AS (
SELECT s,s s1, REPLACE(','||:s||',',','||s||',',',') as s2
FROM t
UNION ALL
SELECT t.s,t2.s1||','||t.s,REPLACE(','||t2.s2||',',','||t.s||',',',') as s2
FROM t, T2
WHERE t2.s<t.s
)
SELECT s1,TRIM(BOTH ',' FROM s2) FROM t2
WHERE TRIM(BOTH ',' FROM s2) IS NOT NULL;
它提供了逐层控制的功能,用REPLACE很方便地把新加入的字符从补集中剔除。 |
|