考虑一个包含三行的数据库表:

Peter
Paul
Mary

有没有一种简单的方法可以把它变成一个Peter, Paul, Mary的字符串?

推荐答案

如果您使用的是SQL Server 2017或Azure,请参阅Mathieu Renda answer.

当我试图连接两个具有一对多关系的表时,我遇到了类似的问题.在SQL2005中,我发现XML PATH方法可以非常轻松地处理行的连接.

如果有一张桌子叫STUDENTS

SubjectID       StudentName
----------      -------------
1               Mary
1               John
1               Sam
2               Alaina
2               Edward

我预期的结果是:

SubjectID       StudentName
----------      -------------
1               Mary, John, Sam
2               Alaina, Edward

我使用了以下T-SQL个选项:

SELECT Main.SubjectID,
       LEFT(Main.Students,Len(Main.Students)-1) As "Students"
FROM
    (
        SELECT DISTINCT ST2.SubjectID, 
            (
                SELECT ST1.StudentName + ',' AS [text()]
                FROM dbo.Students ST1
                WHERE ST1.SubjectID = ST2.SubjectID
                ORDER BY ST1.SubjectID
                FOR XML PATH (''), TYPE
            ).value('text()[1]','nvarchar(max)') [Students]
        FROM dbo.Students ST2
    ) [Main]

如果你可以在开头加上逗号,用substring跳过第一个,这样你就不需要做子查询了,那么你也可以用更简洁的方式做同样的事情:

SELECT DISTINCT ST2.SubjectID, 
    SUBSTRING(
        (
            SELECT ','+ST1.StudentName  AS [text()]
            FROM dbo.Students ST1
            WHERE ST1.SubjectID = ST2.SubjectID
            ORDER BY ST1.SubjectID
            FOR XML PATH (''), TYPE
        ).value('text()[1]','nvarchar(max)'), 2, 1000) [Students]
FROM dbo.Students ST2

Sql相关问答推荐

在SQL中向每个子字节组添加字节行

如何将多个 Select 查询从一个表中组合出来

当我们加入两个表时,我们可以省略GROUP BY中的列名吗?

不可能在SQL MERGE子句中引发异常

R中对Arrow duckdb工作流的SQL查询

提高写密集型表的查询性能

如何嵌套两条SQL语句

BigQuery-当子查询不返回任何结果时,所有结果为零

SQL:如何在表中同时使用GROUPING和CONDITION?

如何将`now()`作为SQL插入语句的一部分?

根据时间、状态和相关行在PostgreSQL中的存在来删除行

如何将不同层次的产品组和规格组合到最深一层?

从给定数据中查找下一个工作日期

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

Postgresql 生成器列导致语法错误

SQL 根据前一天的最大值计算每天的值数

如何将输出转换为二维格式?

如何通过CROSS APPLY获取多级嵌套JSON属性的值?

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

来自 SQL Server 的树层次 struct 图的 JSON