Enkel fråga
Detta kan vara mycket enklare med PostgreSQL 9.1 eller senare . Som förklaras i detta närbesläktade svar:
- PGError:ERROR:aggregationer är inte tillåtna i WHERE-satsen på en AR-fråga för ett objekt och dess has_many-objekt
Det räcker med att GROUP BY
den primära nyckeln av ett bord. Sedan:
foo1 är en primärnyckel
.. du kan förenkla ditt exempel till:
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!
Fråga med flera tabeller
Men eftersom du har:
många fler fält och LEFT JOINs, den viktiga delen är att alla dessa fält har 1 till 1 eller 1 till 0 relation förutom ett fält som är 1 till n som jag vill aggregera
.. det borde vara snabbare och enklare att samla först, gå med senare :
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 ...
På så sätt behöver inte den stora delen av din fråga aggregeras alls.
Jag gav nyligen ett testfall i en SQL Fiddle för att bevisa poängen i detta relaterade svar:
- PostgreSQL - ordna efter en array
Eftersom du syftar på detta relaterade svar:Nej, DISTINCT
kommer inte att hjälpa alls i det här fallet.