Jednoduchý dotaz
To může být mnohem jednodušší s PostgreSQL 9.1 nebo novější . Jak je vysvětleno v této úzce související odpovědi:
- PGError:ERROR:agregace nejsou povoleny v klauzuli WHERE v dotazu AR na objekt a jeho has_many objektů
Stačí GROUP BY
primární klíč stolu. Od:
foo1 je primární klíč
.. svůj příklad můžete zjednodušit na:
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!
Dotaz s více tabulkami
Nicméně, protože máte:
mnohem více polí a LEFT JOINů, důležitá část je, že všechna tato pole mají vztah 1 ku 1 nebo 1 ku 0 kromě jednoho pole, které je 1 až n, které chci agregovat
.. mělo by být rychlejší a jednodušší nejprve agregovat, později se připojit :
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 ...
Tímto způsobem velká část vašeho dotazu vůbec nepotřebuje agregaci.
Nedávno jsem poskytl testovací případ v SQL Fiddle, abych dokázal bod v této související odpovědi:
- PostgreSQL – řazení podle pole
Protože odkazujete na tuto související odpověď:Ne, DISTINCT
v tomto případě vůbec nepomůže.