sql server子查询用逗号分隔的结果集

时间:2011-11-28 21:09:31

标签: sql sql-server join subquery

我需要在表上返回记录,我的结果集需要包含逗号分隔列表。

我附上了3张桌子的图片。我需要做一个select,它返回第一个表中的记录,并包含屏幕截图中第3个表中存在的最后一个AwardFocusName。

所以我的结果集会返回一条记录,并在其中包含AwardFocusNames列表(以逗号分隔)。

enter image description here

4 个答案:

答案 0 :(得分:52)

这是我过去用来做类似事情的技巧。使用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作为一个大数字来表示“所有其余字符串”。

答案 1 :(得分:2)

像这样创建一个标量值函数

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

答案 2 :(得分:1)

我认为最好的解决方案是创建一个用户定义的聚合,将值(在一个组中)连接成一个以逗号分隔的列表。请参阅示例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

答案 3 :(得分:1)