-2

У меня есть следующие две таблицыОтображение нескольких значений из двух таблиц в одной строке в SQL Server

TableA   Table B 

id    bid bname  btitle 
----    ------------------------------ 
1    1 john  titlejohn 
2    1 william titlewilliam 
3    1 george titlegeorge 
       2 bill  titlebill 
       3 kyle  titlekyle 
       3 seb  titleseb 

мне нужен запрос в SQL Server, который отображает следующий вывод:

id name      title 
1 john,william,george  titlejohn,titlewilliam,titlegeorgw 
2 bill      titlebill 
3 kyle,seb     titlekyle,titleseb 

Пожалуйста, помогите ,

ответ

1

Вот одно из решений. Он обрабатывает только bname, но вы можете расширить его для обработки btitle. Конкатенация значений столбцов для данного ключа не является естественным в SQL, поэтому вам нужна хитрость, чтобы прокрутить таблицу, извлекая каждую строку с тем же ключом. Хитрость заключается в создании таблицы памяти с столбцом идентификации (n say), который автоматически вводится на каждую вставку. Вы можете выполнить цикл, выбрав n = 1, затем n = 2 и т. Д., Чтобы создать строку.

create function tbl_join_name(@id int) 
returns varchar(max) 
as 
begin 
    declare @tbl table (n int identity(1,1), name varchar(max), title varchar(max)) 
    insert @tbl(name, title) 
    select bname, btitle from TableB where bid = @id 

    declare @n int = 1, @name varchar(max) = '', @count int = (select count(*) from @tbl) 
    while @n <= @count begin 
     set @name = @name + (case @name when '' then '' else ',' end) + (select name from @tbl where n = @n) 
     set @n = @n + 1 
    end 
    return @name 
end 
go 

select id, tbl_join_name(id) as bname --, tbl_join_title(id) as btitle 
from TableA 

Это не очень эффективно. Протестировано с Sql Server 2008 R2.

2
select id, name = stuff(n.name, 1, 1, ''), title = stuff(t.title, 1, 1, '') 
from TableA a 
    outer apply 
    (
     select ',' + bname 
     from TableB x 
     where x.bid = a.id 
     for xml path('') 
    ) n (name) 
    outer apply 
    (
     select ',' + btitle 
     from TableB x 
     where x.bid = a.id 
     for xml path('') 
    ) t (title) 
0

Другой способ:

SELECT A.id, 
     STUFF((SELECT ','+bname 
     FROM TableB B 
     WHERE B.bid = A.id 
     FOR XML PATH('')),1,1,'') as name, 
     STUFF((SELECT ','+btitle 
     FROM TableB B 
     WHERE B.bid = A.id 
     FOR XML PATH('')),1,1,'') as title 
FROM TableA A 

Выход:

id name    title 
1 john,william,george titlejohn,titlewilliam,titlegeorge 
2 bill    titlebill 
3 kyle,seb   titlekyle,titleseb 
Смежные вопросы