Eenvoudige vraag
Dit kan veel eenvoudiger met PostgreSQL 9.1 of hoger . Zoals uitgelegd in dit nauw verwante antwoord:
- PGError:ERROR:aggregaten niet toegestaan in WHERE-clausule op een AR-query van een object en zijn has_many objecten
Het is voldoende om GROUP BY
de primaire sleutel van een tafel. Sinds:
foo1 is een primaire sleutel
.. je kunt je voorbeeld vereenvoudigen tot:
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 met meerdere tabellen
Maar aangezien u:
veel meer velden en LEFT JOINs, het belangrijkste is dat al deze velden een 1 op 1 of 1 op 0 relatie hebben, behalve één veld dat 1 tot n is en dat ik wil samenvoegen
.. het zou sneller en eenvoudiger moeten zijn om eerst samen te voegen, later mee te doen :
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 ...
Op deze manier hoeft het grootste deel van uw zoekopdracht helemaal niet te worden samengevoegd.
Ik heb onlangs een testcase in een SQL Fiddle gegeven om het punt in dit gerelateerde antwoord te bewijzen:
- PostgreSQL - rangschikken op array
Aangezien u verwijst naar dit gerelateerde antwoord:Nee, DISTINCT
zal in dit geval helemaal niet helpen.