Подтвердить что ты не робот

Суб-запрос sql server с разделенным запятыми набором результатов

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

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

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

enter image description here

4b9b3361

Ответ 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