将表中与条件匹配的所有行聚合到单个字符串

问题描述 投票:0回答:1

我有以下2张表:

Person
------
PersonId int PK
Name varchar
ThingCollectionId int
=======================
PersonId    Name    ThingCollectionId
1           Joe     100
2           Mary    101
3           Dave    102


Thing
-----
ThingId int PK
ThingCollectionId int
Name varchar
=======================
ThingId ThingCollectionId   Name
1       101                 Baseball
2       102                 Basketball
3       102                 Football

Thing
表中的每一行代表一个对象。 对象被分组为集合,由
ThingCollectionId
标识。 每个
Person
都与一个事物集合相关联。

我需要一个查询来聚合与 Person 表中的行关联的集合中所有事物的名称。 请注意,集合中可能有任意数量的事物,从 0 到任何正数。 我想从这个查询中得到的结果如下所示:

PersonId    Name    Things
1           Joe     [NULL]
2           Mary    Baseball
3           Dave    Basketball,Football

是否可以通过单个查询获得我正在寻找的内容?

我正在使用 SQLServer 2022:

Microsoft SQL Server 2022 (RTM-CU13) (KB5036432) - 16.0.4125.3 (X64) 
    May  1 2024 15:05:56 
    Copyright (C) 2022 Microsoft Corporation
    Developer Edition (64-bit) on Linux (Ubuntu 22.04.4 LTS) <X64>
sql sql-server sql-server-2022
1个回答
0
投票

是的,这是可能的。您可以使用 string_agg ,它是 sqlservers 上的 listagg

SELECT p.personid, p.name
     , string_agg(t.name, '')
FROM person p
JOIN thing t
   USING (thingcollectionid)
GROUP BY p.personid, p.name

未经测试,但应该相当接近

© www.soinside.com 2019 - 2024. All rights reserved.