【问题标题】:sql server sub query with a comma separated resultset带有逗号分隔结果集的 sql server 子查询
【发布时间】:2025-11-23 21:40:01
【问题描述】:

我需要返回表中的记录,并且我的结果集需要包含一个逗号分隔的列表。

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

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

【问题讨论】:

  • 表格名称为 Nomination、AwardFocus、NominationAwardFocus(按照它们在屏幕截图中出现的顺序)。

标签: sql sql-server join subquery


【解决方案1】:

这是我过去用来做类似事情的一个技巧。使用SUBSTRING 函数。

选择 n.nominationID , 子串(( SELECT ',' + naf.awardFocusName FROM NominationAwardFocus naf 加入奖Focus af ON naf.awardFocusID = af.awardFocusID 其中 n.nominationID = naf.nominationID 用于 XML 路径('') ), 2, 1000000) 来自提名 n

请注意,2 用于切断子选择添加到第一项的前导逗号,选择 1000000 作为一个大数字表示“字符串的所有其余部分”。

【讨论】:

  • 您应该尝试使用包含&awardFocusName。不漂亮。
  • 我确实遇到了 & 问题,但是一个简单的 REPLACE 解决了这个问题。
  • 我希望我能多次投票给这个答案。先生,你拯救了我的一天,谢谢:)
  • 谢谢!我希望在 MySQL 中有一个类似 GROUP_CONCAT 的函数
  • 使用 STUFF 函数 *.com/a/31212160/8595398 的类似解决方案请参见此处
【解决方案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

【讨论】:

    【解决方案3】:

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

    【讨论】: