2015-06-19 90 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的情况下, ,否则让它去

相关问题