Kueri sederhana
Ini bisa lebih sederhana dengan PostgreSQL 9.1 atau lebih baru . Seperti yang dijelaskan dalam jawaban yang terkait erat ini:
- PGError:ERROR:agregat tidak diizinkan dalam klausa WHERE pada kueri AR dari suatu objek dan objeknya memiliki_banyak
Cukup GROUP BY
kunci utama dari sebuah meja. Sejak:
foo1 adalah kunci utama
.. Anda dapat menyederhanakan contoh Anda menjadi:
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!
Kueri dengan banyak tabel
Namun, karena Anda memiliki:
lebih banyak bidang dan GABUNG KIRI, bagian yang penting adalah bahwa semua bidang ini memiliki hubungan 1 hingga 1 atau 1 hingga 0 kecuali satu bidang yaitu 1 hingga n yang ingin saya gabungkan
.. seharusnya lebih cepat dan lebih mudah untuk menggabungkan dulu, bergabung nanti :
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 ...
Dengan cara ini sebagian besar kueri Anda tidak memerlukan agregasi sama sekali.
Saya baru-baru ini memberikan kasus uji dalam SQL Fiddle untuk membuktikan maksudnya dalam jawaban terkait ini:
- PostgreSQL - urutkan menurut larik
Karena Anda mengacu pada jawaban terkait ini:Tidak, DISTINCT
tidak akan membantu sama sekali dalam kasus ini.