Proste zapytanie
To może być znacznie prostsze z PostgreSQL 9.1 lub nowszym . Jak wyjaśniono w tej ściśle powiązanej odpowiedzi:
- PGError:ERROR:agregacje niedozwolone w klauzuli WHERE w zapytaniu AR obiektu i jego obiektów has_many
Wystarczy GROUP BY
klucz podstawowy tabeli. Od:
foo1 to klucz podstawowy
.. możesz uprościć swój przykład do:
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!
Zapytanie z wieloma tabelami
Jednak ponieważ masz:
o wiele więcej pól i LEFT JOIN, ważne jest to, że wszystkie te pola mają relacje 1 do 1 lub 1 do 0, z wyjątkiem jednego pola, które ma wartość 1 do n, które chcę agregować
.. powinno być szybsze i prostsze najpierw agregowanie, dołączanie później :
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 ...
W ten sposób duża część zapytania w ogóle nie wymaga agregacji.
Niedawno przedstawiłem przypadek testowy w SQL Fiddle, aby udowodnić słuszność tej powiązanej odpowiedzi:
- PostgreSQL — uporządkowanie według tablicy
Ponieważ odnosisz się do tej powiązanej odpowiedzi:Nie, DISTINCT
w tym przypadku nie pomoże.