Для объединения строк вы можете использовать этот метод: Как объединить все строки из определенного столбца для каждой группы
Данные испытаний:
declare @masterTable table(MasterId int identity, MasterName varchar(max))
insert @masterTable (MasterName) values('m1'), ('m2'), ('m3'), ('m4')
declare @childrenTable table(ChildId int identity, ChildName varchar(max))
insert @childrenTable (ChildName) values('c1'), ('c2'), ('c3'), ('c4')
declare @LinkTable table(MasterId1 int, MasterId2 int, ChildId int)
insert @LinkTable values(1,1,1), (2,2,1), (3,3,2), (4,4,3)
Запрос:
select t.*
from
(
select c.ChildId, c.ChildName
, STUFF((
select ', ' + m.MasterName
from
(
select l.MasterId1
from @LinkTable l
where l.ChildId = c.ChildId
union
select l.MasterId2
from @LinkTable l
where l.ChildId = c.ChildId
)t
join @masterTable m on m.MasterId = t.MasterId1
for xml path(''), type
).value('.', 'varchar(max)'), 1, 2, '') [names]
, STUFF((
select ', ' + cast(t.MasterId1 as varchar(max))
from
(
select l.MasterId1
from @LinkTable l
where l.ChildId = c.ChildId
union
select l.MasterId2
from @LinkTable l
where l.ChildId = c.ChildId
)t
for xml path(''), type
).value('.', 'varchar(max)'), 1, 2, '') [ids]
from @childrenTable c
)t
where t.ids is not null
Выход:
----------- --- -------- ------
1 c1 m1, m2 1, 2
2 c2 m3 3
3 c3 m4 4