SQL 内连接和分组依据以获取逗号分隔值

Posted

技术标签:

【中文标题】SQL 内连接和分组依据以获取逗号分隔值【英文标题】:SQL inner join and group by to get comma separated values 【发布时间】:2020-03-24 20:15:06 【问题描述】:

我有以下三个表格,我想从中得到一个具体的结果

表A

key1    key2
-------------
121     4
131     4
141     5
151     3
161     3
171     6
181     6
191     6
...     ...

表B:

key1    key3
-------------
121     1001
131     1111
141     1111
151     1222
161     1222
171     1234
181     1001
191     1111
...     ...

表C:

key3    key4
-------------
1001    "aa"
1111    "gg"
1222    "hh"
1234    "jj"
...     ...

我想要一个 SQL 查询(可以使用内连接)给我以下结果:

key2    key4
-------------------------
3       "hh"
4       "aa", "gg"
5       "gg"
6       "aa", "gg", "jj"

微软 SQL Server 2012

【问题讨论】:

【参考方案1】:

你可以使用string_agg():

select t1.key2, string_agg(t3.key4, ',') key4
from table1 t1
inner join table2 t2 on t2.key1 = t1.key1
inner join table3 t3 on t3.key3 = t1.key3
group by t1.key2

【讨论】:

错误 - 'string_agg' 不是可识别的内置函数名称 @vjjj:你确定你是在 Posgres 数据库上运行这个吗? 它的 SQL 服务器,会改变标签,我的错! @vjjj:字符串聚合函数是特定于供应商的...... SQL Server 的哪个版本? 2017 年有string_agg() Microsoft SQL Server 2012【参考方案2】:

请尝试以下 SQL 查询:

SELECT key2, string_agg(key4, ",")
FROM TableA JOIN TableB USING (key1) JOIN TableC USING (key3)
GROUP BY key2

【讨论】:

以上是关于SQL 内连接和分组依据以获取逗号分隔值的主要内容,如果未能解决你的问题,请参考以下文章

Google表格中的笛卡尔/交叉连接以获取逗号分隔值

在 2 个表之间使用内连接,对于 1 个特定列的多条记录,对整数列求和,使 varchar 列以逗号分隔

内连接+计数+分组依据

获取 Sql-Server 中逗号分隔值中未分组列的详细信息

拆分和合并列中唯一的 SQL 逗号分隔值,然后分组

如何用引号和逗号连接多列单元格数据