Einfache Abfrage
Dies kann viel einfacher sein mit PostgreSQL 9.1 oder höher . Wie in dieser eng verwandten Antwort erläutert:
- PGError:FEHLER:Aggregate sind in WHERE-Klausel bei einer AR-Abfrage eines Objekts und seiner has_many-Objekte nicht zulässig
Es genügt GROUP BY
der Primärschlüssel eines Tisches. Seit:
foo1 ist ein Primärschlüssel
.. können Sie Ihr Beispiel vereinfachen zu:
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!
Abfrage mit mehreren Tabellen
Da Sie jedoch:
viele weitere Felder und LEFT JOINs, der wichtige Teil ist, dass alle diese Felder eine 1-zu-1- oder 1-zu-0-Beziehung haben, mit Ausnahme eines Felds, das 1-zu-n ist, das ich aggregieren möchte
.. es sollte schneller und einfacher sein, zuerst zu aggregieren, später beizutreten :
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 ...
Auf diese Weise muss der große Teil Ihrer Abfrage überhaupt nicht aggregiert werden.
Ich habe kürzlich einen Testfall in einer SQL-Geige bereitgestellt, um den Punkt in dieser verwandten Antwort zu beweisen:
- PostgreSQL - Sortieren nach einem Array
Da Sie sich auf diese verwandte Antwort beziehen:Nein, DISTINCT
wird in diesem Fall überhaupt nicht helfen.