我有一张这样的桌子

Movie   Actor   
  A       1
  A       2
  A       3
  B       4

我想知道一部电影的名字和该电影中的所有演员,我希望结果是这样的:

Movie   ActorList
 A       1, 2, 3

我该怎么做?

推荐答案

聚合函数string_agg()(Postgres 9.0或更高版本)更简单:

SELECT movie, string_agg(actor, ', ') AS actor_list
FROM   tbl
GROUP  BY 1;

GROUP BY 1中的1是位置参照,在本例中是GROUP BY movie的快捷方式.

string_agg()期望数据类型text作为输入.其他类型需要显式转换(actor::text)——unless定义了对text的隐式转换——这是所有其他字符类型(varcharcharacter"char")和其他一些类型的情况.

作为isapir commented,如果需要,可以在聚合调用中添加ORDER BY子句以获得排序列表.比如:

SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;

但对子查询中的行进行排序通常更快.见:

Sql相关问答推荐

比较表中的一些值

仅向自己显示受惩罚用户的聊天消息

如何有效诊断 SQL Server 2012 数据库插入上的“等待操作超时”?

雪花.如何判断子数组是否存在于另一个数组中?

如何合并这些查询并创建单个查询

如何快速判断表是否超过 N 行?

Airflow PostgresHook 错误编解码器无法解码位置 3 中的字节 0xc3

如何在 Sql 中聚合

为什么这个转换为 DATETIME2?

oracle json_value vs. json_table 解释查询计划

如何计算将 null 视为零的平均值

视图是否自动更新

无法访问 Big Query 中类型为 ARRAY> 的字段

计算PostgreSQL中字符串中子字符串的出现次数

无法删除表用户,因为其他对象依赖于它

批量插入,如果在 Postgres 上发生冲突(批量 upsert)则更新

使用 Python 连接到 Microsoft SQL 服务器

空数组作为 PostgreSQL 数组列默认值

LATERAL JOIN 和 PostgreSQL 中的子查询有什么区别?

使用 ActiveRecord 和 Yii2 记录实际的 SQL 查询?