假如一个业务系统,有一个用户列表,需要在用户列表显示用户的客户,一个用户可以有多个客户。
需要如下效果
全部代码在底下
用户表[T_User]的数据如下
客户表[T_Customer]的数据如下
关联表[T_User_Customer]的数据如下
当我们利用left join把用户的客户拿过来的时候,因为张三是有三个客户的,对应就会有三条数据,如下图
很明显,这不是我们想要的,我们希望看到的是要把张三的三条数据的客户合并到一条数据里面去。
要达到这个目的,有两步,
1、根据数据相同的列对数据进行分组 ;
2、合并数据不同的列。
分组就不说了,说说合并数据,
要用到 for xml path,
先上代码吧
with tmp as (
select
u.Id,
u.UserName,
u.CreateTime,
c.Name CustomerName
from T_User u
left join T_User_Customer uc on uc.UserId = u.Id
left join T_Customer c on c.Id = uc.CustomerId
)
select
Id,
UserName,
CreateTime
,stuff((select ','+CustomerName from tmp where id=t.id for xml path('')),1,1,'') as CustomerName
from tmp t
group by Id,UserName,CreateTime
就是这句 select ','+CustomerName from tmp where id=t.id for xml path(''),利用一个子查询把id相同的数据通过for xml path加起来。
就得出我们想要的效果了
又是一年1024了,节日快乐,同志们