Plus simple avec la fonction d'agrégation string_agg() (Postgres 9.0 ou version ultérieure) :
SELECT movie, string_agg(actor, ', ') AS actor_list
FROM tbl
GROUP BY 1;
Le 1 dans GROUP BY 1 est une référence de position et un raccourci pour GROUP BY movie dans ce cas.
string_agg() attend le type de données text comme entrée. Les autres types doivent être castés explicitement (actor::text ) - sauf si un transtypage implicite en text est défini - ce qui est le cas pour tous les autres types de caractères (varchar , character , "char" ), et quelques autres types.
Comme isapir l'a commenté, vous pouvez ajouter un ORDER BY clause dans l'appel agrégé pour obtenir une liste triée - si vous en avez besoin. Comme :
SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM tbl
GROUP BY 1; Mais il est généralement plus rapide de trier les lignes dans une sous-requête. Voir :
- Postgres SQL - Créer un tableau dans Select