Consulta sencilla
Esto puede ser mucho más simple con PostgreSQL 9.1 o posterior . Como se explica en esta respuesta estrechamente relacionada:
- PGError:ERROR:agregados no permitidos en la cláusula WHERE en una consulta AR de un objeto y sus objetos has_many
Basta con GROUP BY
la clave principal de una mesa Desde:
foo1 es una clave principal
.. puedes simplificar tu ejemplo a:
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
FROM tbl1
GROUP BY 1
ORDER BY foo7, foo8; -- have to be spelled out, since not in select list!
Consulta con varias tablas
Sin embargo, dado que tiene:
muchos más campos y LEFT JOIN, la parte importante es que todos estos campos tienen una relación de 1 a 1 o de 1 a 0 excepto un campo que es de 1 a n que quiero agregar
.. debería ser más rápido y sencillo agregar primero, unirse después :
SELECT t1.foo1, t1.foo2, ...
, t2.bar1, t2.bar2, ...
, a.aggregated_col
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON ...
...
LEFT JOIN (
SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col
FROM agg_tbl a ON ...
GROUP BY some_id
) a ON a.some_id = ?.some_id
ORDER BY ...
De esta manera, la gran parte de su consulta no necesita agregación en absoluto.
Recientemente proporcioné un caso de prueba en un SQL Fiddle para probar el punto en esta respuesta relacionada:
- PostgreSQL:ordenar por matriz
Ya que te refieres a esta respuesta relacionada:No, DISTINCT
no va a ayudar en absoluto en este caso.