4

数据库:SQL Server 2008。

我有一个像这样的真正(假)常规查询:-

SELECT CarId, NumberPlate
    (SELECT Owner
     FROM Owners b
     WHERE b.CarId = a.CarId) AS Owners
FROM Cars a
ORDER BY NumberPlate

这就是我想要得到的......

=> 1    ABC123     John, Jill, Jane
=> 2    XYZ123     Fred
=> 3    SOHOT      Jon Skeet, ScottGu

所以,我尝试使用

AS[Text()] ... FOR XML PATH('')但那包括奇怪的编码字符(例如回车)。...所以我对此不是 100% 满意。

我还尝试查看是否有 COALESCE 解决方案,但我所有的尝试都失败了。

所以 - 有什么建议吗?

4

3 回答 3

6

回答一个旧帖子,只是认为它需要更新 SQL Server 的新版本:

对于 SQL Server 2017 使用 STRING_AGG(表达式,分隔符)

GROUP_CONCAT 是 MySQL。

在 SQL 2017 之前,您还可以执行以下操作(从我们当前基于 SQL Server 2016 的代码库中截取):

SELECT CarId, NumberPlate,
    (STUFF(( SELECT ', ' + b.Owner
        FROM Owners b
        WHERE b.CarId = a.CarId
        FOR XML PATH('')
        )
        ,1,2,'') AS Owners
FROM Cars a
ORDER BY NumberPlate

STRING_AGG 的链接 https://database.guide/the-sql-server-equivalent-to-group_concat/ https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact -sql?view=sql-server-2017

链接到 STUFF: https ://docs.microsoft.com/en-us/sql/t-sql/functions/stuff-transact-sql?view=sql-server-2017

最后链接到 FOR XML: https ://docs.microsoft.com/en-us/sql/relational-databases/xml/for-xml-sql-server?view=sql-server-2017

于 2019-04-24T03:14:51.583 回答
3

尝试解决这个问题:

如何创建 SQL Server 函数以将子查询中的多行“加入”到单个分隔字段中?

:)

于 2009-06-19T07:35:58.963 回答
-1

采用GROUP_CONCAT

SELECT CarId, NumberPlate
    (SELECT GROUP_CONCAT(Owner)
     FROM Owners b
     WHERE b.CarId = a.CarId) AS Owners
    FROM Cars a
ORDER BY NumberPlate
于 2019-03-23T13:10:11.873 回答