2015-06-17 26 views
0

我很抱歉沒有很好的解釋這個。 我有一些像這樣的數據的SQL數據庫:在sql中包含子字符串的組合

column1 | groups  
3323052 | 3323052,3324794,3324795 
3324794 | 3323052,3324794 
3324794 | 3324794 
3324794 | 3324794,3763369 
3353586 | 3353586 
3763369 | 3324794,3763369 

我想結合組,這樣,如果一個號碼在兩個組,各組將結合和數量將只在列表中顯示出來一次。

例如,最後的結果是這樣的:

3323052,3324794,3324795,3763369

我一直在谷歌上搜索周圍無祝你好運。任何幫助是極大的讚賞。 謝謝。

+0

什麼需要的組結合後發生在列1值測試呢? –

回答

0

所以,你想要遞歸地替換組中的任何項目 - 列中的任何值與列中的值爲1的其他行中找到?至少可以這樣來做:

  1. 斯普利特資料列,所以只是COLUMN1 - >組關係
  2. 獲取,可以用來作爲根節點的任何值,我的做法爲最小值,因爲你的數據有一個圓(3323052 - > 3324794 - > 3323052)
  3. 獲取遞歸都可以從層次結構這些根節點下找到了價值
  4. 把它放回一起放入原始格式

本例使用DelimitedSplit8k傑夫MODEN:

-- Step 1: 
select distinct 
    d.column1, 
    convert(int, s.Item) as item 
into #tmp 
from 
    data d 
    cross apply DelimitedSplit8k(d.groups, ',') s 

-- Step 2: 
select distinct 
    column1 
into #root 
from #tmp t1 
where not exists 
(select 1 from #tmp t2 where t2.item = t1.column1 and t2.item > t2.column1) 

-- Step 3: 
;with CTE (root, parent, child) as (
    select r.column1, r.column1, r.column1 from #root r 
    union all 
    select C.root, t.column1, t.item 
    from CTE C join #tmp t on t.column1 = C.child and t.item > C.parent 
) 
select distinct * into #results from CTE 

-- Step 4: 
SELECT r.column1, STUFF((SELECT distinct ', ' + convert(varchar(50), r2.child) 
    FROM #results r2 
    WHERE r2.root = r.column1 
    ORDER BY ', ' + convert(varchar(50), r2.child) 
    FOR XML PATH(N'')), 1, 2, '') as groups 
FROM #root r 
GROUP BY column1 
ORDER BY column1 

結果:

column1  groups 
3323052  3323052, 3324794, 3324795, 3763369 
3353586  3353586 

我用溫度。表確保每個步驟只執行一次,但我相信只需一次選擇並使用CTE而不是臨時表就可以完成整個過程。

可以在SQL Fiddle

+0

你真令人驚歎!非常感謝! :) – DBird

相關問題