Суб-запрос sql server с разделенным запятыми набором результатов
Мне нужно вернуть записи в таблицу, и мой результирующий набор должен содержать список, разделенный запятыми.
Я прикрепил изображение трех таблиц. Мне нужно сделать выбор, который возвращает запись в первой таблице и включает в себя последнее имя AwardFocusName, которое существует в третьей таблице на скриншоте.
Таким образом, мой результирующий набор вернет одну запись и включит в нее список имен AwardFocusNames (разделенные запятой).
![enter image description here]()
Ответы
Ответ 1
Вот трюк, который я использовал в прошлом, чтобы делать подобные вещи. Используйте функцию SUBSTRING.
SELECT n.nominationID
, SUBSTRING((
SELECT ',' + naf.awardFocusName
FROM NominationAwardFocus naf
JOIN AwardFocus af
ON naf.awardFocusID = af.awardFocusID
WHERE n.nominationID = naf.nominationID
FOR XML PATH('')
), 2, 1000000)
FROM Nomination n
Обратите внимание, что 2 используется, чтобы отрубить начальную запятую, которую подвыбор добавляет к первому элементу, и 1000000 выбрано в качестве большого числа, чтобы означать "все остальные строки".
Ответ 2
Создайте Scalar-значную функцию, подобную этой
CREATE FUNCTION [dbo].[CreateCSV](
@Id AS INT
)
RETURNS VARCHAR(MAX)
AS
BEGIN
Declare @lst varchar(max)
select @lst = isnull(@lst+',','')+AF.AwardFocusName
from AwardFocus as AF
inner join AwardFoccusNomination as AFN
on AF.AwardFocusID = AFN.AwardFocusID
where [email protected]
return @lst
END
Ответ 3
Я думаю, что лучшим решением было бы создать агрегат, определенный пользователем, который объединяет значения (в группе) в список, разделенный запятыми. См. Пример 1
at: http://msdn.microsoft.com/en-us/library/ms131056.aspx
Использование:
SELECT
Nomination.NominationId,
Nomination.Created,
Nomination.Updated,
dbo.Concatenate(AwardFocus.AwardFocusName) As Names
FROM
Nomination
JOIN NominationAwardFocus
ON Nomination.NominationId = NominationAwardFocus.NominationId
JOIN AwardFocus
ON NominationAwardFocus.AwardFocusId = AwardFocus.AwardFocusId
GROUP BY
Nomination.NominationId,
Nomination.Created,
Nomination.Updated
Ответ 4
Я объясню, как это сделать в моем блоге, здесь:
http://johniekarr.wordpress.com/2011/08/08/pushing-multiple-results-into-one-column/