Подзапрос сервера sql с разделенным запятыми набором результатов - PullRequest
23 голосов
/ 29 ноября 2011

Мне нужно вернуть записи в таблицу, и мой набор результатов должен содержать список через запятую.

Я приложил изображение 3 таблиц. Мне нужно сделать выборку, которая возвращает запись в первой таблице и включает в себя последнее из AwardFocusName, которое существует в 3-й таблице на скриншоте.

Таким образом, мой набор результатов будет возвращать одну запись и включать в нее список AwardFocusNames (через запятую).

enter image description here

Ответы [ 4 ]

52 голосов
/ 29 ноября 2011

Вот трюк, который я использовал в прошлом, чтобы делать подобные вещи.Используйте функцию 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 голосов
/ 29 ноября 2011

Создайте скалярную функцию, подобную этой

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 AFN.NominationID=@Id


    return @lst

END
1 голос
/ 29 ноября 2011

Я объясняю, как это сделать, в моем блоге, здесь:

http://johniekarr.wordpress.com/2011/08/08/pushing-multiple-results-into-one-column/

1 голос
/ 29 ноября 2011

Я думаю, что лучшим решением было бы создание пользовательского агрегата, который объединяет значения (в группе) в список через запятую. См. Пример 1 в: 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
...