我需要在表上返回记录,我的结果集需要包含逗号分隔列表。
我附上了3张桌子的图片。我需要做一个select,它返回第一个表中的记录,并包含屏幕截图中第3个表中存在的最后一个AwardFocusName。
所以我的结果集会返回一条记录,并在其中包含AwardFocusNames列表(以逗号分隔)。
答案 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)