标题不重要,理解意思就行。
表Test
id | pids |
---|---|
1 | 1,2,3 |
2 | 2,4 |
2 | 3,4,5 |
表Tab
id | txt |
---|---|
1 | txt1 |
2 | txt2 |
3 | txt4 |
…………
要得到的结果是
id | pids | txts |
---|---|---|
1 | 1,2,3 | txt1,txt2,txt3, |
2 | 2,4 | txt2,txt4, |
…………
select id,pids, (select txt + ',' from (
select a.id,b.txt
from test a, tab b
where ',' + a.pids+ ',' like '%,' + CONVERT(nvarchar(max),b.id) + ',%'
) a where a.id = test.id for xml path('') ) txts
from test
group by id,pids
以上的的SQL基于你的PID是唯一的,如果“pids” 里重复的话结果会只出现一次
如果“pids”里重复的话,需要将pids拆分开然后关联查询并且将结果拼接
怎么拆分网上多的是,我随手从网上找了一段
例如:
select id,pids, (select txt + ',' from (
select a.id,b.txt from (select a.id, a.pids
from ( select id, pids, convert(xml, '<n>' + replace(replace(pids, ',', ','), ',', '</n><n>') + '</n>') as xmlval
from test) a
cross apply ( select k.n.value('.', 'nvarchar(max)') retids
from a.xmlval.nodes('n') k(n) ) bs) a left join
tab b
on a.retids =b.id
) a where a.id = t.id for xml path('') ) txts
from test t
group by id,pids
当然最好的还是在设计表的时候再建立一个中间表用来存两表之间的关系