Richiesta semplice
Questo può essere molto più semplice con PostgreSQL 9.1 o versioni successive . Come spiegato in questa risposta strettamente correlata:
- PGError:ERROR:aggregati non consentiti nella clausola WHERE su una query AR di un oggetto e dei suoi has_many objects
È sufficiente GROUP BY
la chiave primaria di un tavolo. Da:
foo1 è una chiave primaria
.. puoi semplificare il tuo esempio in:
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!
Query con più tabelle
Tuttavia, dal momento che hai:
molti più campi e LEFT JOIN, la parte importante è che tutti questi campi hanno una relazione da 1 a 1 o da 1 a 0 tranne un campo che va da 1 a n che voglio aggregare
.. dovrebbe essere più rapido e semplice prima aggregare, poi unirti :
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 ...
In questo modo gran parte della tua query non ha bisogno di aggregazione.
Di recente ho fornito un test case in un SQL Fiddle per dimostrare il punto in questa risposta correlata:
- PostgreSQL:ordine per array
Poiché ti riferisci a questa risposta correlata:No, DISTINCT
non aiuterà affatto in questo caso.