2015-06-19 86 views
0

我嘗試過彎曲我的Google-fu無濟於事,所以我在這裏!不幸的是,我不能改變這些表格的任何內容,因爲它們是從我不得不報告的應用程序中提取出來的。在SQL Server 2008中,我試圖用另一個表(表2)中的值替換一個文本字符串列(表1)中的多個值。SQL Server 2008 - 用另一個表中的值替換列中的文本值

在此先感謝!

表1

id value 
------------- 
1 a1, a2, a3 
2 a2, a3 
3 a4 

表2

id value 
--------- 
a1 Value1 
a2 Value2 
a3 Value3 
a4 Value4 

所需的輸出

id value 
----------------------------- 
1 Value1, Value2, Value3 
2 Value2, Value3 
3 Value4 
+1

請顯示你迄今嘗試過的。 –

+0

我甚至不完全確定從哪裏開始。我正在考慮使用REPLACE函數,但是因爲我不確定如何在每個值的字面意義上寫REPLACE之外如何使用REPLACE函數。 –

回答

0

我爲提前:)這個解決方案很抱歉它做你需要什麼,但:

create table TableA(
id int, 
string varchar(255) 
) 

create table table2(
id varchar , text varchar(255) 
) 

insert into tableA values(1,'a,b,c,d') 
insert into tableA values(2,'e,f') 

insert into table2 values('a', 'value1') 
insert into table2 values('b', 'value2') 
insert into table2 values('c', 'value3') 
insert into table2 values('d', 'value4') 
insert into table2 values('e', 'value5') 
insert into table2 values('f', 'value6') 



select id, left(myConcat,len(myConcat)-1) from (
select c.id, replace(replace(CAST(CAST('<i'+stuff((select * from(
SELECT A.[id] , 
    Split.a.value('.', 'VARCHAR(1000)') AS String 
FROM (SELECT [id], 
     CAST ('<M>' + REPLACE([string], ',', '</M><M>') + '</M>' AS XML) AS String 
    FROM TableA) AS A CROSS APPLY String.nodes ('/M') AS Split(a)) a 
    inner join table2 b on a.String = b.id 
    where a.id = c.id            
    FOR XML PATH ('') 
    ),1,2,'') AS XML).query('/text') AS VARCHAR(1000)),'<text>',''),'</text>',',') myConcat 
    from TableA c 
    group by c.id 
) d 
+0

不適合我..雖然看上去很花哨..我得到TableA中兩個ID的所有值 – JamieD77

+0

良好的漁獲,我固定它 –

+0

任何辦法擺脫使用這個最後一個逗號,而不做其他選擇和使用'左(@String,LEN(@String) - 1)' – JamieD77

0

此部位有分隔的文本分割功能http://www.sqlservercentral.com/articles/Tally+Table/72993/

使用THA t函數將您的值分解到臨時表中。用新值替換臨時表中的值。然後使用STUFF..FOR XML將記錄合併到一起並更新您的表格。

有一些cte的查詢應該能夠在將函數添加到數據庫後處理所有這些。

例使用Sql Fiddle

+0

這個問題比分裂要複雜得多。這是一個分裂,+一個連接+一個重新連接。 –

+0

這是我包括的例子很明顯。以及我在第二段中使用的所有時段。 – JamieD77

0

使用DelimitedSplit8K在http://www.sqlservercentral.com/articles/Tally+Table/72993/發現@的建議user1221684你可能會想出這樣的事情。使用這樣的分隔數據是一種痛苦。首先,你必須解析字符串,以便將它加入到另一個表中,然後通過將其填充回非規範化的形式來破壞。

確保如果你使用這個,你明白這個函數和這個代碼在做什麼。這不是入門級的t-sql,它將是你在凌晨3點支持它,而不是我。

if OBJECT_ID('tempdb..#table1') is not null 
    drop table #table1; 

create table #table1 
(
    id int, 
    value varchar(50) 
); 

insert #table1 
    select 1, 'a1, a2, a3' union all 
    select 2, 'a2, a3' union all 
    select 3, 'a4'; 

if OBJECT_ID('tempdb..#table2') is not null 
    drop table #table2; 

create table #table2 
(
    id varchar(50), 
    value varchar(50) 
); 

insert #table2 
    select 'a1', 'Value1' union all 
    select 'a2', 'Value2' union all 
    select 'a3', 'Value3' union all 
    select 'a4', 'Value4'; 

with parsedValues as 
(
    select t1.id 
     , t1.value 
     , LTRIM(x.item) as item 
    from #table1 t1 
    cross apply dbo.DelimitedSplit8K(t1.value, ',') x 
) 
, swappedVals as 
(
    select pv.id 
     , t2.value 
    from parsedValues pv 
    join #table2 t2 on t2.id = pv.item 
) 

select id 
    , STUFF((select ',' + value 
     from swappedVals sv2 
     where sv2.id = sv.id 
     order by sv2.value --need to make sure to order here so the results are in the right order 
     for XML path('')), 1, 1, '') as MyValues 
from swappedVals sv 
group by id 
; 
0

使用此:

DECLARE @t TABLE(id int,value varchar(255)) 
INSERT INTO @t (id,value) 
    VALUES(1,'a1'),(2,'a2'),(3,'a3').... 

SELECT *,STUFF((SELECT DISTINCT ','+value FROM @t WHERE id=t.id) 
    FOR XML PATH('')),1,2,' ') 

FROM (SELECT DISTINCT ID FROM @t) t 

DISTINCT在同一ID的情況下, ,否則讓它去

相關問題