Конкатенация результатов подзапроса в T-SQL
Дано: Возьмем для примера вот такую простенькую бд
Цель: Получить в результате запроса список авторов с названием книг в одну строку. То есть вид должен быть примерно таким:
| fullname | books |
|--------------|--------------------|
| Vasya Pupkin | Lalalala; Babababa |
| Ivanov Petr | Qwerty; Asdfgh |
Как делал: Сам пытался применить функцию CONCAT_WS для конкатенации через разделитель, но функция принимает только отдельные строки, а не результаты подзапроса.
select
Author.fullname,
CONCAT_WS('; ', (
select Book.caption
from Book
where Book.author = Author.id
)) as books
from Author
Вопрос: Как, собственно, получить целевой результат? Доступа к бд на создание хранимых процедур нет. Возможно только отправлять запросы к удаленной базе.
Ответы (1 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
SQL
-- DDL and sample data population, start
DECLARE @Author TABLE ([id] integer primary key, [fullname] varchar(50));
DECLARE @Book TABLE (
[id] integer primary key,
[caption] varchar(50),
[author] integer
);
INSERT INTO @Author ([id], [fullname]) VALUES
(1, 'Vasya Pupkin'),
(2, 'Ivanov Petr');
INSERT INTO @Book ([id], [caption], [author]) VALUES
(1, 'Lalalala', 1),
(2, 'Babababa', 1),
(3, 'Qwerty', 2),
(4, 'Asdfgh', 2);
-- DDL and sample data population, end
SELECT a.Id, a.fullname, STRING_AGG(b.caption, ', ') as bookList
FROM @Author AS a LEFT OUTER JOIN
@Book AS b ON a.id = b.author
GROUP BY a.Id, a.fullname;