Consulta simples
Isso pode ser muito mais simples com PostgreSQL 9.1 ou posterior . Conforme explicado nesta resposta intimamente relacionada:
- PGError:ERROR:agregações não permitidas na cláusula WHERE em uma consulta AR de um objeto e seus objetos has_many
Basta
GROUP BY
a chave primária de uma mesa. Desde a:
foo1 é uma chave primária
.. você pode simplificar seu exemplo para:
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 com várias tabelas
No entanto, desde que você tenha:
muitos mais campos e LEFT JOINs, a parte importante é que todos esses campos têm relação de 1 para 1 ou 1 para 0, exceto um campo que é 1 para n que eu quero agregar
.. deve ser mais rápido e simples agregar primeiro, juntar depois :
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 ...
Dessa forma, a grande parte da sua consulta não precisa de agregação.
Recentemente, forneci um caso de teste em um SQL Fiddle para provar o ponto nesta resposta relacionada:
- PostgreSQL - ordena por uma matriz
Como você está se referindo a esta resposta relacionada:Não,
DISTINCT
não vai ajudar em nada neste caso.