2011-07-25 33 views
3

我有表Sitetable與包含用逗號分隔的多個值(,),想拆它,所以我得到了自己的行,但與相同數量的每個站點列面前。如何列數據拆分到不同的行

所以我的輸入數據是:

Number    Site 
952240    2-78,2-89 
952423    2-78,2-83,8-34 

和我的預期產出將是:

Number    Site 
952240    2-78 
952240    2-89 
952423    2-78 
952423    2-83 
952423    8-34 
+0

有人,請格式化我的問題。我不知道上述的方式。的 – Shine

+3

而不是試圖「分裂」行,你應該重新設計你的數據模型和規範你的表...... –

+0

嗯,與Oracle我改造逗號分隔的列表爲'VARRAY VARCHAR2',然後UNNEST並再次加入該陣列。但我不認爲SQL Server支持數組類型? –

回答

0

(不可直接你要找的,但答案,你在評論...問這個)

你爲什麼需要這個「黑客」的原因是因爲你的表是不歸。如果移動網站和數量之間的關係到它自己的表,你的問題解決了:

number_table (number, ...) 
site_table (site_id, site_name, ...) 
assigned_site (number, site_id) 

從asssigned_site到number_table和site_table外鍵。

如果你的表格是結構化的這種方式,一個簡單的加入會做你想要什麼:

SELECT nb.number, agn.site_id, sit.site_name 
FROM number_table nb 
    JOIN assigned_site agn ON nb.number = agn.number 
    JOIN site sit ON sit.site_id = agn.site_id 

site_table是唯一必要的,如果你的網站有與實際標識除了附加屬性(如在我的例子與site_name)。

如果您的網站由ID,那麼你不需要site_table,你的問題歸結爲一個簡單的SELECT * FROM assigned_site

+0

是的,我瞭解規範化如何幫助我獲得我需要的格式。但是,我有一個表中的上述形式的數據。請給我一個想法,把它分成上面的表格。 – Shine

0

這一個辦法,做你想做的。只是在下面的查詢Sitetable更換@T

declare @T table 
(
    Number int, 
    Site varchar(20) 
) 

insert into @T values 
(952240, '2-78,2-89'), 
(952423, '2-78,2-83,8-34') 

select T1.Number, 
     T3.I.value('.', 'varchar(5)') as Site 
from @T as T1 
    cross apply (select cast('<i>'+replace(T1.Site, ',', '</i><i>')+'</i>' as xml)) as T2(X) 
    cross apply T2.X.nodes('i') as T3(I) 
0

這個問題已經解決了: SQL Server 2008 - split multi-value column into rows with unique values

在你的情況,

With Inputs As 
(
    select 952240 as Number, '2-78,2-89' as [Site] 
    union 
    select 952423, '2-78,2-83,8-34' 
) 
, XCte As 
(
    Select number, Cast('<data>' + Replace(Inputs.[Site], ',', '</data><data>') + '</data>' As xml) As XValue 
    From Inputs 
) 
Select Number, Y.data.value('.','nvarchar(max)') As Site 
From XCte 
    Cross Apply XValue.nodes('//data') Y(data)