如何关联三张表并聚合第三张表中的列?
解决方案
你的需求可以通过聚合函数实现,结合表关联与去重逻辑就能得到目标结果,以下是具体实现方案:
适用多数现代数据库(PostgreSQL、SQL Server等)的SQL语句
SELECT a.id AS id_table_a, STRING_AGG(DISTINCT c.item, ', ') AS item FROM "A" a LEFT JOIN "B" b ON a.id = b.table_a LEFT JOIN "C" c ON b.id = c.table_b GROUP BY a.id ORDER BY a.id;
关键逻辑说明
- 表关联:用
LEFT JOIN保证表A的每一行都会被保留,即便没有对应的表B或表C数据(此时item字段会返回NULL);若确认表A的所有行都有关联数据,也可替换为INNER JOIN。 - 去重聚合:通过
DISTINCT关键字在STRING_AGG中过滤重复的item(比如表C中id100对应的两条Apple记录),确保结果里每个item仅出现一次。 - 分组规则:按表A的
id分组,实现每个表A行对应一行聚合结果。
执行结果
| id_table_a | item |
|---|---|
| 1 | Apple, Orange |
| 2 | Apple, Banana, Rice |
适配MySQL 5.x版本的替代语句
若使用不支持STRING_AGG的MySQL 5.x,可改用GROUP_CONCAT:
SELECT a.id AS id_table_a, GROUP_CONCAT(DISTINCT c.item SEPARATOR ', ') AS item FROM `A` a LEFT JOIN `B` b ON a.id = b.table_a LEFT JOIN `C` c ON b.id = c.table_b GROUP BY a.id ORDER BY a.id;
内容的提问来源于stack exchange,提问作者ayrtondenner
相关产品推荐
相关产品推荐

