Simpel forespørgsel
Dette kan være meget enklere med PostgreSQL 9.1 eller nyere . Som forklaret i dette nært beslægtede svar:
- PGError:FEJL:aggregater er ikke tilladt i WHERE-sætning på en AR-forespørgsel af et objekt og dets har_mange objekter
Det er nok at GROUP BY
den primære nøgle af et bord. Siden:
foo1 er en primær nøgle
.. du kan forenkle dit eksempel til:
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!
Forespørgsel med flere tabeller
Men da du har:
mange flere felter og LEFT JOINs, den vigtige del er, at alle disse felter har 1 til 1 eller 1 til 0 relation undtagen et felt, der er 1 til n, som jeg vil aggregere
.. det burde være hurtigere og nemmere at samle først, deltage senere :
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å denne måde behøver den store del af din forespørgsel slet ikke aggregering.
Jeg har for nylig fremlagt en testcase i en SQL Fiddle for at bevise pointen i dette relaterede svar:
- PostgreSQL - bestil efter en matrix
Da du henviser til dette relaterede svar:Nej, DISTINCT
kommer ikke til at hjælpe overhovedet i dette tilfælde.