Проста заявка
Това може да е много по-просто с PostgreSQL 9.1 или по-нова версия . Както е обяснено в този тясно свързан отговор:
- PGError:ГРЕШКА:агрегатите не са разрешени в клаузата WHERE на AR заявка на обект и неговите has_many обекти
Достатъчно е да GROUP BY
първичния ключ на маса. Тъй като:
foo1 е първичен ключ
.. можете да опростите примера си до:
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!
Заявка с множество таблици
Въпреки това, тъй като имате:
много повече полета и LEFT JOIN, важната част е, че всички тези полета имат връзка 1 към 1 или 1 към 0 с изключение на едно поле, което е от 1 до n, което искам да обединя
.. трябва да е по-бързо и по-лесно заобединяване първо, присъединяване по-късно :
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 ...
По този начин голямата част от вашата заявка изобщо не се нуждае от агрегиране.
Наскоро предоставих тестов случай в SQL Fiddle, за да докажа смисъла на този свързан отговор:
- PostgreSQL – подреждане по масив
Тъй като имате предвид този свързан отговор:Не, DISTINCT
няма да помогне изобщо в този случай.