SQL 外键ID数组关联查询拼接字符串

标题不重要,理解意思就行。
表Test

idpids
11,2,3
22,4
23,4,5

表Tab

idtxt
1txt1
2txt2
3txt4

…………
要得到的结果是

idpidstxts
11,2,3txt1,txt2,txt3,
22,4txt2,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

当然最好的还是在设计表的时候再建立一个中间表用来存两表之间的关系

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值