|
|
原帖由 chen222246lei 于 2009-11-4 13:49 发表 ![]()
WITH TEMP AS
(
SELECT 'a1' COL_A,'a4' COL_B FROM DUAL UNION
SELECT 'a1' COL_A,'a3' COL_B FROM DUAL UNION
SELECT 'a4' COL_A,'a2' COL_B FROM DUAL UNION
SELECT 'a3' COL_A,'a6' COL_B FROM DUAL UNION
SELECT 'a4' COL_A,'a1' COL_B FROM DUAL UNION
SELECT 'a4' COL_A,'a8' COL_B FROM DUAL UNION
SELECT 'a10' COL_A,'a5' COL_B FROM DUAL UNION
SELECT 'a5' COL_A,'a9' COL_B FROM DUAL
)
SELECT MAX(TEXT1) TEXT FROM
(SELECT WMSYS.WM_CONCAT(TEXT) OVER(PARTITION BY GROP ORDER BY RN1) TEXT1,T.* FROM
(SELECT TEXT,RN1,SUM(GROP) OVER(ORDER BY RN1) GROP,ROW_NUMBER() OVER(PARTITION BY TEXT ORDER BY RN1) RN2 FROM
(SELECT COL_B TEXT,ROWNUM RN1,DECODE(LEVEL,1,1,0) GROP FROM
(SELECT NULL COL_A,COL_A COL_B FROM TEMP GROUP BY COL_A
UNION
SELECT * FROM TEMP
) CONNECT BY NOCYCLE COL_A = PRIOR COL_B START WITH COL_A IS NULL
) T ORDER BY RN1
) T WHERE RN2 = 1
) GROUP BY GROP
1 a1,a3,a6,a4,a2,a8
2 a10,a5,a9
我也來一個:
with test as (
select 'a1' l,'a4' r from dual union all
select 'a1','a3' from dual union all
select 'a4','a2' from dual union all
select 'a3','a6' from dual union all
select 'a4','a1' from dual union all
select 'a4','a8' from dual union all
select 'a10','a5' from dual union all
select 'a5','a9' from dual)
select wm_concat(l)
from (select l, sum(dbms_utility.get_hash_value(r, 100000000, 10000)) sm /* 假定值最多有10000個 */
from (select distinct connect_by_root l l, r
from (select l, r
from test
union
select r, l from test)
connect by nocycle l = prior r)
group by l)
group by sm;
WM_CONCAT(L)
--------------------------------------------------------------------------------
a10,a9,a5
a1,a8,a6,a2,a4,a3
[ 本帖最后由 nyfor 于 2009-11-4 15:01 编辑 ] |
|